Oracle SQL-从多行中选择特定数据成行

时间:2019-05-16 16:31:22

标签: sql oracle

我正在尝试将多行数据选择为一行。 例如,使用以下数据集:

NAME     THING        DATE
-----   ------       ------
JACK     1            EARLY
JACK     2            LATER
JACK     3            NOW
JANE     1            LATER
JANE     2            EARLY
JANE     3            NOW

我想产生以下结果:

NAME       THING          DATE
----        ----          -----
JACK        1, 2, 3       NOW
JANE        1, 2, 3       NOW

所以,我知道我可以使用LISTAGG函数来组合“事物”行,但是我最大的问题是如何在多行中进行选择以在日期字段中获得“现在”值。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

尚不清楚您是否想要任何事物的最新日期(按日期或按其自身的值对汇总的事物进行排序):

select name,
  listagg(thing, ',') within group (order by date_col) as things,
  max(date_col) as now
from your_table
group by name
order by name;

或对应于事物最高价值的日期:

select name,
  listagg(thing, ',') within group (order by thing) as things,
  max(date_col) keep (dense_rank last order by thing) as now
from your_table
group by name
order by name;

正如您所说的,这些实际上是日期,带有两个名称的添加日期值的示例数据略有不同:

NAME      THING DATE_COL  
---- ---------- ----------
JACK          1 2019-01-01
JACK          2 2019-03-15
JACK          3 2019-04-30
JANE          1 2019-02-01
JANE          2 2019-05-03
JANE          3 2019-04-02

第一个查询得到:

NAME THINGS          NOW       
---- --------------- ----------
JACK 1,2,3           2019-04-30
JANE 1,3,2           2019-05-03

第二个查询得到:

NAME THINGS          NOW       
---- --------------- ----------
JACK 1,2,3           2019-04-30
JANE 1,2,3           2019-04-02

db<>fiddle