我在SQL Server中有一个表,其中每一行都是要传递的邮件。每封电子邮件都属于一个域名。
我需要根据日期列选择要发送的第一封电子邮件,但我想从循环方式中使用的最后一个域开始按域替换它们
表:
CREATE TABLE Delivery (Date datetime, Domain int);
INSERT INTO Delivery (Date, Domain)
VALUES
('2014-01-07 11:24:31', 1),
('2014-04-07 13:21:42', 2),
('2014-02-07 14:48:58', 3),
('2014-03-07 15:58:01', 1),
('2014-06-07 15:58:01', 2),
('2014-01-07 12:58:01', 3),
('2014-01-07 19:58:01', 1) ;
使用此查询,我可以根据需要对它们进行排序,但我找不到用起始值对它们进行排序的方法:
SELECT [Date],[Domain]
FROM (
SELECT [Date] ,[Domain],
ROW_NUMBER() OVER (PARTITION BY [Domain] ORDER BY [Date]) AS recID
FROM Delivery ) AS r
ORDER BY recID, [domain]
我需要说:
ORDER BY [domain] > @lastuseddomain
的内容
我需要以TOP 1
的定时间隔运行此查询
预期的结果是使用域>获得最早的行。上一行的域(如果存在)或使用domain = 1重新启动。
就像在域上进行循环排序一样
答案 0 :(得分:1)
你需要使用cte
它允许您使用ROW_NUMBER()作为where条件
with cte as
(
SELECT [Date] ,[Domain],
ROW_NUMBER() OVER (PARTITION BY [Domain] ORDER BY [Date]) AS recID
FROM Delivery
)
select * from cte
where recID = 1
order by domain
答案 1 :(得分:1)
感谢你们的努力,但我想我找到了解决方案:
SELECT TOP 1 [Date],[Domain]
FROM (
SELECT [Date] ,[Domain],
ROW_NUMBER() OVER (PARTITION BY [Domain] ORDER BY [Date]) AS recID
FROM Delivery ) AS r
ORDER BY recID,
(CASE WHEN domain >@LASTUSEDDOMAIN THEN domain
ELSE domain + (select top 1 domain from delivery order by domain desc)
END)
答案 2 :(得分:0)
编辑 -
我完全错了。下面的Blam给了你真正的答案。道歉!
原帖:
考虑到任意数量的域名(和时间),我不知道如何在SQL中完成这项工作,我担心。您需要在结果集中使用行N来设置选择行N + 1的条件,而这不能完成。使用有限数量的域/次,您可以使用UNPIVOT查询执行某些操作,但我认为您必须使用动态SQL - 由程序生成的SQL,并知道要处理的数据是什么
如果这是正确的,那么在您获得数据后,您可能会浪费时间生成查询并运行(我无法查看它是如何成为有效的查询) 。相反,将数据放入代码中的一些可搜索列表中,然后在代码中获取第一个,然后知道第一个获取第二个等等。
听起来像一个令人讨厌的代码,但正确的可搜索结构可能很有趣。
抱歉,我不能提供更多帮助,但我不知道如何做到这一点。