我有以下方式的表结构:
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
怎么做?
答案 0 :(得分:2)
这是Top N per category problem in SQL的特例,其中var svg=document.getElementsByTagName('svg');
if (svg!=undefined && svg!=null) {
svg[0].style.minWidth='fit-content';
svg[0].style.minHeight='fit-content';
}
可能适用一些更简单的解决方案:
现有答案建议在派生表中使用N = 1
,这显然是有效的。但是在大多数情况下,as I have explained in this article使用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
订购。如果需要其他顺序,请替换QTY
子句。
此方法适用于所有RDBMS
在Oracle中,您可以使用特定于供应商的FIRST
聚合函数,该函数使用以下语法
ORDER BY
我已经看到这种方法比基于窗口函数的方法要好,但是请务必检查一下。
答案 1 :(得分:0)
如果值不需要来自同一行,则一种方法是聚合:
select item, max(loc) as loc, . . .
from t
group by item;
如果您想要同一行中的所有值,请使用row_number()
:
select t.*
from (select t.*, row_number() over (partition by item order by item) as seqnum
from t
) t
where seqnum = 1;
答案 2 :(得分:0)
如果您只想要每列item
的最小值(这是您的预期结果所示),那么:
SELECT ITEM,
MIN( LOC ) AS LOC,
MIN( status ) AS status,
MIN( qty ) AS qty
FROM table_name
GROUP BY item
如果您希望项目的值对特定订单最小,则:
SELECT ITEM,
MIN( LOC ) KEEP ( DENSE_RANK FIRST ORDER BY your_criteria ) AS LOC,
MIN( status ) KEEP ( DENSE_RANK FIRST ORDER BY your_criteria ) AS status,
MIN( qty ) KEEP ( DENSE_RANK FIRST ORDER BY your_criteria ) AS qty
FROM table_name
GROUP BY item
或者,如果你想成为同一行的所有人,那么:
SELECT item, loc, status, qty
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY item ORDER BY your_criteria ) AS RN
FROM table_name t
)
WHERE RN = 1;