2014-11-06 71 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 

你真的会加入同一个表两次吗?