sql之一列上的 Oracle Distinct
mengfanrong
阅读:16
2025-01-19 22:14:33
评论:0
我有以下方式的表结构:
ITEM LOC STATUS QTY
001 RS1 A 10
001 JS1 I 20
110 RS1 A 4
我只想根据不同的 ITEM 检索结果,而不管这些值随附
所以结果应该是
ITEM LOC STATUS QTY
001 JS1 A 10
110 RS1 A 4
怎么做 ?
请您参考如下方法:
这是 Top N per category problem in SQL 的一个特例,其中 N = 1
,在这种情况下,一些更简单的解决方案可能适用:
标准的 SQL 解决方案
现有答案建议在派生表中使用 row_number()
,这显然有效。但是 as I have explained in this article ,在大多数情况下使用 first_value()
会更直接。您的结果可以由这个查询产生:
SELECT DISTINCT
item,
first_value (loc) OVER (PARTITION BY item ORDER BY qty) loc,
first_value (status) OVER (PARTITION BY item ORDER BY qty) status,
first_value (qty) OVER (PARTITION BY item ORDER BY qty) qty,
FROM t
ORDER BY item
这是假设您想按
QTY
订购。如果需要其他排序,请替换
ORDER BY
子句。
这种方法适用于所有 RDBMS
Oracle 特定的解决方案
在 Oracle 中,您可以使用供应商特定的
FIRST
聚合函数,该函数使用以下语法
SELECT
item,
MAX (loc) KEEP (DENSE_RANK FIRST ORDER BY qty) loc,
MAX (status) KEEP (DENSE_RANK FIRST ORDER BY qty) status,
MAX (qty) KEEP (DENSE_RANK FIRST ORDER BY qty) qty,
FROM t
GROUP BY item
ORDER BY item
我已经看到这比基于窗口函数的方法表现更好,但请检查一下。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。