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 

我已经看到这比基于窗口函数的方法表现更好,但请检查一下。


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号