将最小日期和相应金额返回到该不同的ID

时间:2011-11-24 17:01:28

标签: sql sql-server-2005 tsql duplicates

下午

当我有多个相同的日期但是Owed列中的值都不同时,我试图返回SQL Server 2005中的最小值/最大值。我已经通过我的select语句将表格过滤到临时表中以获取不同的查询,当我尝试镜像时,我有所有重复的日期,您可以在下面看到。

我现在有一张表格如下:

ID| Date   |Owes
-----------------
1  20110901 89
1  20110901 179
1  20110901 101
1  20110901 197 
1  20110901 510
2  20111001 10
2  20111001 211
2  20111001 214 
2  20111001 669

我当前的查询:

Drop Table #Temp

Select Distinct Convert(Varchar(8), DateAdd(dd, Datediff(DD,0,DateDue),0),112)as Date
,ID
,Paid
Into #Temp
From Table
Where Paid <> '0'

Select ,Id           
       ,Date
       ,Max(Owed)
       ,Min(Owed)          

From #Temp
Group by ID, Date, Paid
Order By ID, Date, Paid

这并没有删除任何相同的日期,我是SQL的新手,但我认为它是因为我的owed列有不同的值。我基本上希望能够撤回第一条记录,因为这将始终是我的最低工资,而我的最后一条记录将永远是我的最大欠款,用于计算我欠ID的总额。

我是SQL的新手,所以想了解我对构建查询的未来知识做错了什么?

非常感谢

2 个答案:

答案 0 :(得分:2)

在“select into”语句中,您没有Owed列?

GROUP BY是您“去除相同值”的常规方法。如果按ID和日期进行分组,则会在结果中为这两列中的每个不同值对获取一行。结果中的每一行代表基础表中的所有行,MIN,MAX等聚合函数可以提取值。

SELECT id, date, MAX(owes) as MaxOwes, MIN(owes) as minOwes
FROM myFavoriteTable
GROUP BY id, date

在SQL Server 2005中,有“窗口函数”,允许您在记录组上使用聚合函数,而无需分组。以下是一个例子。表格中的每一行都会得到一行:

 SELECT id, date, owes, 
 MAX(Owes) over (PARTITION BY  select, id) AS MaxOwes,
 MIN(Owes) over (PARTITION BY select, id) AS MinOwes
 FROM myfavoriteTable

如果您将列命名为“MinOwes”,则可能听起来像是在钓鱼。

答案 1 :(得分:1)

如果您想按日期分组,也不能按ID进行分组,因为ID可能是唯一的。试试:

Select ,Date
       ,Min(Owed) AS min_date
       ,Max(Owed) AS max_date
From #Temp
Group by Date
Order By Date

要从行中获取其他值(您的问题有点模糊),您可以使用窗口函数:

SELECT DISTINCT
      ,Date
      ,first_value(ID)   OVER (PARTITION BY Date ORDER BY Owed) AS min_owed_ID
      ,last_value(ID)    OVER (PARTITION BY Date ORDER BY Owed) AS max_owed_ID
      ,first_value(Owed) OVER (PARTITION BY Date ORDER BY Owed) AS min_owed
      ,last_value(Owed)  OVER (PARTITION BY Date ORDER BY Owed) AS max_owed
FROM   #Temp
ORDER  BY Date;