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)
怎么做 ?
这是SQL 中每个类别前 N 个问题的一个特例,其中N = 1
,在这种情况下可能会应用一些更简单的解决方案:
现有答案建议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)
这是假设您想按 订购QTY
。ORDER BY
如果需要其他排序,请替换该子句。
这种方法适用于所有 RDBMS
在 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)
我已经看到这比基于窗口函数的方法表现更好,但请检查一下。
如果值不需要来自同一行,一种方法是聚合:
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)
归档时间: |
|
查看次数: |
6052 次 |
最近记录: |