【问题标题】:Select top 15 records from each group [duplicate]从每个组中选择前 15 条记录
【发布时间】:2020-02-04 18:37:08
【问题描述】:

我想选择 10 个商户账户,为每个商户账户选择前 15 条交易记录,页面大小为 10*50 ?

我有这个查询,它为我提供了最重要的记录,我需要修复以选择“每个商家帐户 ID 的前 15 条记录”,而不仅仅是前 150 条记录。

欢迎任何指针、建议、代码修复!

SELECT * FROM (
             SELECT account_id,transaction_id,ROWNUM RNUM
             FROM transactions 
             WHERE status='P' AND ROWNUM < ( (p_page_number * p_page_size) + 1)
             GROUP BY account_id,transaction_id, ROWNUM
             ORDER BY account_id                 
             ) a
      WHERE rnum >= ( ( (p_page_number - 1) * p_page_size) + 1);

【问题讨论】:

  • 谢谢巴拉吉比拉杰达尔。我想知道您使用的是什么版本的数据库?
  • 查找交叉应用和fetch first 15 rows only..asktom.oracle.com/pls/asktom/…
  • 哪 15 笔交易?您希望他们如何订购最新的产品?最老的?基于 transaction_ID?

标签: sql oracle filtering greatest-n-per-group paging


【解决方案1】:

这将为您提供“每个商家帐户 ID 的前 15 条记录”:

SELECT *
FROM (
  SELECT 
    account_id, 
    transaction_id, 
    ROW_NUMBER() OVER(
      PARTITION BY account_id -- Break into groups of merchants
      ORDER BY transaction_id -- Assign row number based on transaction, within merchants
    ) RowNum
  FROM transactions
  WHERE status='P'
) src
WHERE src.RowNum <= 15
ORDER BY account_id, transaction_id

我不太确定您的 p_page_number, p_page_size, and ROWNUM 参数如何发挥作用。

【讨论】:

    【解决方案2】:

    您可以使用DENSE_RANK() 窗口函数将组号分配给行,并使用ROW_NUMBER() 在每个组内分配一个序列号。然后,过滤很容易。

    例如:

    select *
    from (
      select
        account_id, 
        transaction_id,
        dense_rank() over(order by account_id) as g,
        row_number() over(partition by account_id order by transaction_id) as rn
      from transactions
      where status = 'P'
    ) x
    where g <= 10 -- the first 10 groups (accounts)
      and rn <= 15 -- the first 15 transactions within each group
    

    【讨论】:

    • 不重要,但我注意到主选择缺少任何属性。谢谢
    • @alexgibbs 谢谢。完全错过了。
    • 这是完美的。非常感谢@TheImpaler 你拯救了我的一天。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2023-03-25
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多