【问题标题】:I need result from select statement as multiple data of birth for a single id我需要 select 语句的结果作为单个 id 的多个出生数据
【发布时间】:2015-02-24 07:35:30
【问题描述】:
APPLICANT_ID    DATE_OF_BIRTH
206209579       04/29/82
206209579       04/29/82
203276426       06/01/69
203276426       02/03/96
203276426       06/02/99

我需要结果

206209579       04/29/82,04/29/82
203276426       06/01/69,02/03/96

请提出它的需要完整的

【问题讨论】:

  • string aggregation 有多种方法。您需要指定您的版本。从 11g 开始,您可以使用 LISTAGG,否则如果您使用的是先前版本,请查看我的回答。

标签: sql oracle select string-aggregation


【解决方案1】:

在Oracle 11g 及以上版本,可以使用listagg

SELECT   applicant_id,
         LISTAGG(date_of_birth) WITHIN GROUP (ORDER BY date_of_birth)
FROM     my_table
GROUP BY applicant_id 

【讨论】:

  • 更正 - LISTAGG() 不是 List_Agg() - 请修复。 Oracle 10g中有WM_CONCAT()可以使用。
  • @Art, wm_concat 是一个未定义的功能,不应该在生产系统中使用。
  • @Art 我看到 Lalit Kumar B 已经在编辑方面击败了我。感谢您指出!
  • @Art,另外,wm_concat 不再包含在12c 中。
  • @Mureinik 链接似乎不正确,它指向的是 LENGTH 函数而不是 LISTAGG
【解决方案2】:

作为替代方案,对于不支持 LISTAGG11g 之前的 Oracle 版本,您可以使用 ROW_NUMBER()SYS_CONNECT_BY_PATH功能。

测试用例:

SQL> SELECT * FROM table1;

APPLICANT_ID DATE_OF_B
------------ ---------
   206209579 29-APR-82
   206209579 29-APR-82
   203276426 01-JUN-69
   203276426 03-FEB-96
   203276426 02-JUN-99

SQL>
SQL> SELECT applicant_id,
  2         LTRIM(MAX(SYS_CONNECT_BY_PATH(date_of_birth,','))
  3         KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
  4  FROM   (SELECT applicant_id,
  5                 date_of_birth,
  6                 ROW_NUMBER() OVER (PARTITION BY applicant_id ORDER BY date_of_birth) AS curr,
  7                 ROW_NUMBER() OVER (PARTITION BY applicant_id ORDER BY date_of_birth) -1 AS prev
  8          FROM   table1)
  9  GROUP BY applicant_id
 10  CONNECT BY prev = PRIOR curr AND applicant_id = PRIOR applicant_id
 11  START WITH curr = 1;

APPLICANT_ID EMPLOYEES
------------ --------------------------------------------------
   203276426 01-JUN-69,03-FEB-96,02-JUN-99
   206209579 29-APR-82,29-APR-82

SQL>

Tim 的文章here 中演示了其他方法。

【讨论】:

  • 投反对票的人,你愿意说出投反对票的原因吗?为了以防万一,我添加了一个注释。
  • 非常感谢 Lalit Kumar B,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2016-02-29
  • 2014-02-11
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多