【问题标题】:Limit LISTAGG results in Oracle在 Oracle 中限制 LISTAGG 结果
【发布时间】:2017-05-30 13:56:37
【问题描述】:

我试图限制我的 SQL 查询中的一个列,该查询使用 LISTAGG 仅将前 3 行分组到一个列中。

例如:

Table
-----
Name   Orders
---------------
Joe    Joe_Order1
Joe    Joe_Order2
Joe    Joe_Order3
Joe    Joe_Order4
Joe    Joe_Order5
Joe    Joe_Order6
Mark   Mark_Order1
Mark   Mark_Order2
Mark   Mark_Order3
Mark   Mark_Order4

让它返回以下...

Name   Recent_Orders
-----------------------------
Joe    Joe_Order1, Joe_Order2, Joe_Order3
Mark   Mark_Order1, Mark_Order2, Mark_Order3

我可以使用 listagg 连接数据,但是我不完全确定如何将结果限制为前 3 条记录。

SELECT NAME, LISTAGG(Orders, ', ') within group(order by Orders)
  as Recent_Orders
FROM
  Order_table
GROUP BY
  NAME

LISTAGG 可以做到这一点吗?任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: sql oracle listagg


    【解决方案1】:

    在 CTE 中应用 row_number,然后在 WHERE 子句中应用限制

    with CTE as
    (
    select row_number() over(partition by NAME order by Orders) as rn,
           a1.*
    from Order_Table a1
    )
    SELECT NAME, LISTAGG(Orders, ', ') within group(order by Orders)
      as Recent_Orders
    FROM
      CTE
    WHERE 
      rn <=3
    GROUP BY
      NAME
    

    【讨论】:

      【解决方案2】:

      您可以通过枚举行并使用case

      SELECT NAME,
             LISTAGG(CASE WHEN seqnum <= 3 THEN Orders END, ', ') WITHIN GROUP (ORDER BY Orders) as Recent_Orders
      FROM (SELECT o.*, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ?? DESC) as seqnum
            FROM Order_table o
           ) o
      GROUP BY NAME;
      

      默认情况下,LISTAGG() 会忽略 NULL 值,所以这就是你想要的。

      ?? 是指定排序的列。 SQL 表代表 无序 集合;除非列指定了顺序,否则没有“前三个”或“后三个”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-12
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 2016-01-14
        相关资源
        最近更新 更多