Эффективно получать минимальные, максимальные и сводные данные - PullRequest
0 голосов
/ 22 марта 2011

У меня есть таблица счетов и таблица транзакций. В отчете мне нужно показать следующее для каждой учетной записи:

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'

Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

попробуйте это:

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 и поместите его в группу, и внутренний выбор присоединится.Но я думаю, вам нужно только для покупок

0 голосов
/ 22 марта 2011
;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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...