【问题标题】:Efficiently get min,max, and summary data有效地获取最小值、最大值和摘要数据
【发布时间】:2011-07-20 16:52:24
【问题描述】:

我有一张账户表和一张交易表。在报告中,我需要为每个帐户显示以下内容:

First Purchase Date, 
First Purchase Amount, 
Last Purchase Date, 
Last Purchase Amount, 
# of Purchases, 
Total of All Purchases.

事务表如下所示:

TX_UID
Card_Number
Post_Date
TX_Type
TX_Amount

目前,我继承的查询对这些元素中的每一个都有一个子查询。在我看来,必须有一种更有效的方法。我可以为此使用存储过程,而不是单个查询。

获取单个帐户所有交易的查询示例如下:

select * from tx_table where card_number = '12345' and TX_Type = 'Purchase'

有什么想法吗?

【问题讨论】:

    标签: performance sql-server-2005 tsql aggregate


    【解决方案1】:

    试试这个:

    select tt1.post_date as first_purchase_date,
           tt1.tx_amount as first_purchase_amount,
           tt2.post_date as last_purchase_date,
           tt2.tx_amount as last_purchase_amount,
           tg.pc as purchase_count,
           tg.amount as Total
    from (select Card_Number,min(post_date) as  mipd, max(post_date) as mxpd, count(*) as pc, sum(TX_Amount) as Amount from tx_table where TX_Type = 'Purchase' group by card_number) tg
    join tx_table tt1 on tg.card_number=tt1.card_number and tg.mipd=tt1.post_date
    join tx_table tt2 on tg.card_number=tt2.card_number and tg.mxpd=tt2.post_date
    where TX_Type = 'Purchase'
    

    我添加了计数..我第一次没有看到它。

    如果您还需要多个 TX_Types 的摘要,则必须从 where 子句中获取它并将其放入组和内部选择连接中。但我猜你只需要购买

    【讨论】:

    • 谢谢!我能够将其用作模型,并且效果很好。
    【解决方案2】:
    ;with cte as
    (
      select
        Card_Number,
        TX_Type,
        Post_Date,
        TX_Amount,
        row_number() over(partition by TX_Type, Card_Number order by Post_Date asc) as FirstP,
        row_number() over(partition by TX_Type, Card_Number order by Post_Date desc) as LastP
      from tx_table 
    )
    select 
      F.Post_Date as "First Purchase Date",
      F.TX_Amount as "First Purchase Amount",
      L.Post_Date as "Last Purchase Date", 
      L.TX_Amount as "Last Purchase Amount",
      C.CC as "# of Purchases",
      C.Amount as "Total of All Purchases"
    from (select Card_Number, TX_Type, count(*) as CC, sum(TX_Amount) as Amount
          from cte
          group by Card_Number, TX_Type) as C
      inner join cte as F
        on C.Card_Number = F.Card_Number and
           C.TX_Type = F.TX_Type and
           F.FirstP = 1    
      inner join cte as L
        on C.Card_Number = L.Card_Number and
           C.TX_Type = L.TX_Type and
           L.LastP = 1
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多