簡體   English   中英

SQL聚合函數查詢選擇多個列

[英]SQL aggregate function query selecting multiple columns

我正在嘗試查詢下表,這是我的實際表的非常基本的版本,

ID   SaleDate     Amount
1   2014-09-01     50
1   2014-10-01     20
1   2014-11-01     10
2   2013-11-01     10
2   2013-12-01     20
2   2014-01-01     25

得到像這樣的輸出

輸出量

ID   MinDate       MaxDate    StartAmount  EndAmount
1   2014-09-01   2014-11-01     50           10
2   2013-11-01   2014-01-01     10           25

SaleDate一直在增加。 但是數量可能會有所不同。 我為每個ID設置了最小和最大日期。 那是容易的部分。 但是,我也想要SaleDate上的金額。

我嘗試使用這個

Select x.ID,min(x.SaleDate) MinDate, x.Amount StartAmount, max(y.SaleDate) MaxDate,y.Amount EndAmount
From Sales x Join Sales y
On x.ID = y.ID
Group By x.ID,y.ID,x.Amount,y.Amount
Order By x.ID

但我確定我不應該在按功能分組中使用“金額”字段。 SO中是否有類似的問題可以回答這種情況? 或者,如果有一個簡單的解決方案,那就指向我。 我不需要直接回答就可以解決這種情況。

大多數數據庫都支持ANSI標准窗口和排名功能。 您可以使用row_number()和條件聚合來做到這一點:

select s.id, min(saledate) as MinDate, max(saledate) as MaxDate,
       max(case when seqnum = 1 then amount end) as StartAmount,
       max(case when seqnum = cnt then amount end) as EndAmount
from (select s.*, row_number() over (partition by s.id order by s.saledate) as seqnum,
             count(*) over (partition by s.id) as cnt
      from sales s
     ) s
group by s.id;

您需要分兩個步驟進行。 首先是簡單的部分,然后取這些結果,並使用您的最小/最大值來返回原始表,以從相關列中查找值。

    select id, mindate, maxdate, 
           s_min.amount as startamount, s_max.amount as endamount 
    from (
    Select ID,min(SaleDate) MinDate, max(SaleDate) MaxDate
    From Sales s
    Group By ID
    ) d inner join sales s_min on d.mindate = s.saledate and d.id = s.id
    inner join sales s_max on d.maxdate = s.saledate and d.id = s.id

您是否真的兩次參加了同一張桌子?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM