2014-11-06 104 views
0

我想查詢下表,這是我的實際表中的一個非常基本的版本,SQL聚合函數查詢選擇多列

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中是否有類似的問題來回答這種情況?或者如果有一個簡單的解決方案,只需指出我的方式。我不需要直接的答案只是一種處理這種情況的一般方法。

+0

您使用的數據庫是? – 2014-11-06 19:16:41

+0

MS SQl Server 2012 – Xion 2014-11-06 19:23:32

回答

1

大多數數據庫都支持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; 
+0

如上所述,這只是我實際表格的一部分。看起來好像我在表格中還有其他欄目,我想選擇MinDate記錄的其他欄目,但最終我不能這樣做。有沒有解決它的方法? – Xion 2014-11-06 20:01:17

+1

@Xion。 。 。您可以使用與「StartAmount」和「EndAmount」相同的邏輯來選擇附加列。 – 2014-11-06 20:04:14

1

您需要分兩步進行操作。首先,簡單的部分,然後拿這些結果,並使用最小值/最大值重新加入原始表格,以查找相關列中的值。

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 

你真的會加入同一個表兩次嗎?