我有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)也会提供错误的结果。
该问题的解决方案是什么?
答案 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_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