列中的SQL Server最小值

时间:2019-05-08 22:22:20

标签: sql sql-server tsql select

我有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]不为null,[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子句中。

如果我在GROUP BY子句中使用[dis],则会得到错误的结果,并且给出max(dis)或min(dis)也会提供错误的结果。

该问题的解决方案是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:2)

另一种选择是将first_valueminover一起使用:

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