我被这个 SQL 问题难住了,我怀疑这对于那里的人来说很容易。
我有一个表,其中包含代表多个每日排名项目列表的行。相关字段如下:ID、ListID、ItemID、ItemName、ItemRank、Date。
我有一个查询,它返回昨天但今天不在列表中的项目(列表中的项目),如下所示:
Select ItemID, ListID, ItemName, convert(varchar(10),MAX(date),101) as date, COUNT(ItemName) as days_on_list
From Table
Group By ItemID, ListID, ItemName
Having Max(date) = DATEADD("d",-1,convert(varchar(10),getdate(),101)) and ListID = 1
Order By ListID, ItemName, COUNT(ItemName)
基本上我正在寻找最大日期是昨天的记录。它工作正常,并显示每个项目以前在列表中的天数(虽然不一定是连续的,但现在没问题)。
问题是当我尝试添加排名以查看昨天的排名时。我尝试了以下方法:
Select ItemID, ListID, ItemName, ranking, convert(varchar(10),MAX(date),101) as date, COUNT(ItemName) as days_on_list
From Table
Group By ItemID, ListID, ItemName, ranking
Having Max(date) = DATEADD("d",-1,convert(varchar(10),getdate(),101)) and ListID = 1
Order By ListID, ItemName, ranking, COUNT(ItemName)
这将返回比前一个查询更多的记录,因此有些地方不对劲。我想要相同数量的记录,但包括排名。我可以通过使用子查询进行自联接并获取 ItemID 昨天而不是今天出现的记录来获得排名 - 但后来我不知道如何获得 Count 了。
提前感谢您对此的任何帮助。
======== 已解决 ===============
Select ItemID, ListID, ItemName, ranking, convert(varchar(10),MAX(date),101) as date, (Select COUNT(ItemName) From Table T3 Where T3.ItemID = T.ItemID and T3.ListID = 1) as days_on_list
from Table T
Where date = DATEADD("d",-1,convert(varchar(10),getdate(),101)) and ListID = 1 and T.ItemID Not In
(select T.ItemID from Table T
join Table T2 on T.ItemID = T2.ItemID and T.ListID = T2.ListID
where T.date = DATEADD("d",-1,convert(varchar(10),getdate(),101)) and T2.date = convert
(varchar(10),getdate(),101) and T.ListID = 1)
Group by ItemID, ListID, ItemName, ranking
基本上,我所做的是创建一个子查询来查找这两天出现的所有项目,并找到昨天出现但不在这两天出现的项目集中的项目。然后我能够正确地执行聚合函数和分组。如果这比必要的更复杂,我不会感到惊讶,但我理解它并且可以根据需要对其进行修改,并且性能似乎不是问题。
再次感谢大家!