一列上的 Oracle Distinct

Imr*_*ani 4 sql oracle distinct

我有以下方式的表结构:

ITEM  LOC  STATUS  QTY
001   RS1    A     10
001   JS1    I     20
110   RS1    A     4
Run Code Online (Sandbox Code Playgroud)

我只想根据不同的 ITEM 检索结果,而不管这些值随附

所以结果应该是

ITEM   LOC   STATUS   QTY
001    JS1     A      10
110    RS1     A       4
Run Code Online (Sandbox Code Playgroud)

怎么做 ?

Luk*_*der 6

这是SQL 中每个类别前 N 个问题的一个特例,其中N = 1,在这种情况下可能会应用一些更简单的解决方案:

标准的 SQL 解决方案

现有答案建议row_number()在派生表中使用,这显然有效。但正如我在本文中所解释的,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
Run Code Online (Sandbox Code Playgroud)

这是假设您想按 订购QTYORDER 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
Run Code Online (Sandbox Code Playgroud)

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


Gor*_*off 4

如果值不需要来自同一行,一种方法是聚合:

select item, max(loc) as loc, . . .
from t
group by item;
Run Code Online (Sandbox Code Playgroud)

如果您想要同一行中的所有值,请使用row_number()

select t.*
from (select t.*, row_number() over (partition by item order by item) as seqnum
      from t
     ) t
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)