下午
当我有多个相同的日期但是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的新手,所以想了解我对构建查询的未来知识做错了什么?
非常感谢
答案 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;