Oracle列在一列

时间:2016-03-23 13:46:49

标签: sql oracle distinct

我有以下方式的表结构:

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

怎么做?

3 个答案:

答案 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'; } 可能适用一些更简单的解决方案:

标准的SQL解决方案

现有答案建议在派生表中使用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特定解决方案

在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;