Минимальное значение SQL Server в столбце - PullRequest
1 голос
/ 09 мая 2019

У меня есть table_1 со следующими данными:

| STORE | Add | dis | Cnt | 
+-------+-----+-----+-----+
|   101 | X   | abc | 2   | 
|   101 | X   | null| 3   | 
|   101 | X   |pqrd | 4   | 
|   101 | X   | null| 1   | 
|   102 | y   | null| 1   | 
|   102 | y   | xyz | 3   | 
|   102 | y   | pqr | 4   | 
|   102 | y   | null| 2   | 

Я попытался построить запрос для получения данных из table_1, где [dis] не равно нулю, а [cnt] должно быть минимальным.Поэтому мой результат должен выглядеть следующим образом:

| STORE | Add | dis | Cnt | 
+-------+-----+-----+-----+
|   101 | X   | abc | 2   | 
|   102 | y   | xyz | 3   | 

Мой запрос выглядит следующим образом:

SELECT store,add,dis,min(TMPLT_PRIORITY_NMBR)
FROM table_1 group by store,add;

Но я получаю следующую ошибку:

Столбец 'dis 'недопустим в списке выбора, потому что он не содержится ни в статистической функции, ни в предложении GROUP BY.

Если я использую [dis] в предложении GROUP BY, я получаю неверный результат иуказание max (dis) или min (dis) также дает неверный результат.

Каково решение этой проблемы?

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Вы можете использовать rank, чтобы найти строку с минимальным значением cnt для каждой комбинации хранения / добавления и вернуть из нее все столбцы:

SELECT store, add, dis, cnt
FROM   (SELECT *, RANK() OVER (PARTITION BY store, add ORDER BY cnt) AS rk
        FROM   table_1
        WHERE  dis IS NOT NULL) t
WHERE  rk = 1
2 голосов
/ 09 мая 2019

Другой вариант - использовать first_value и min с over:

SELECT distinct store,
       add,
       first_value(dis) over(partition by store, add order by Cnt) as dis,
       min(Cnt) over(partition by store, add) as cnt
FROM table_1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...