SQL聚合函数查询选择多列

时间:2014-11-06 19:15:43

标签: sql sql-server database sql-server-2012

我正在尝试查询下面的表格,这是我实际表格的一个非常基本的版本,

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

但我确信我不应该按功能分组使用Amount字段。 在SO中是否有类似的问题可以解决这种情况?或者,如果有一个简单的解决方案,请指出我的方式。我不需要直接回答只是处理此类案件的一般方法。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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
你真的两次加入同一张桌子吗?