多个聚合函数

时间:2014-05-09 08:05:43

标签: sql sql-server

在包含ItemSupplierValueDate列的SQL Server表中,其中包含所有项目购买的记录,我需要按项目记录最少的记录最近180天的价值。

只有一个项目的样本表:

Item   | Supplier | Value | Date          
---------------------------------------
123    |   28     |  115  | 2013-09-25 
123    |   25     |  125  | 2013-11-30 
123    |   30     |  120  | 2014-01-15 
123    |   25     |  130  | 2014-04-30 

查询结果应为:

123    |   30     |  120  | 2014-01-15  

可能有重复的记录,因为它可能是来自同一供应商的多个原始文档和具有相同项目和值的日期。只需要其中一条记录。

我怎样才能得到它?

3 个答案:

答案 0 :(得分:2)

使用排名函数Row_Number

WITH CTE AS
(
  SELECT Item, Supplier,Value, Date,
         RN = ROW_NUMBER() OVER (PARTITION BY Item
                                 ORDER BY Supplier DESC)
  FROM dbo.TableName
  WHERE DATEDIFF(day, Date, GetDate()) <= 180
)
SELECT Item,  Supplier,Value, Date
FROM CTE
WHERE RN = 1

Demo

然而,它并不清楚你想要的副本或重复是什么。我假设Item确定重复,并且从每个重复的组中获取最大Supplier

如果要使用所有列来确定重复项,则所需结果将包含多行,因为根本没有重复。

答案 1 :(得分:0)

实现这一目标的另一种简单方法:

SELECT TOP 1 * FROM TableName
WHERE DATEDIFF(day, Date, GetDate()) <= 180
ORDER BY VALUE

Demo

答案 2 :(得分:0)

select item, supplier, min_value
from
(
select item, supplier, min_value, row_number() over(order by min_value) as row_num
from
(
select item, supplier, min(value) as min_value
from sales
where DATEDIFF(DAY, mydate ,GETDATE()) <= 180
group by item, supplier
) dt
) dt1
where dt1.row_num = 1