首页 > 解决方案 > SQL Server 列中的最小值

问题描述

我有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 子句中。

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

这个问题的解决方案是什么?

标签: sqlsql-servertsqlselect

解决方案


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

推荐阅读