我在Server中有一个表,其中每一行都是要传递的邮件。每封电子邮件都属于一个域名。
我需要根据日期列选择要发送的第一封电子邮件,但我希望从Round中使用的最后一个域开始按域替换它们
表:
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] SqlFiddle
我要说的是:
ORDER BY [domain] > @lastuseddomain类似于mysql字段()函数的东西
我需要使用TOP 1按时间间隔运行这个查询,如果存在的话,预期的结果是获得上一行的最早行>域,或者用domain=1重新启动。
就像域上的循环排序一样
发布于 2014-06-06 16:44:01
谢谢你们的努力,但我想我找到了解决办法:
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)发布于 2014-06-06 16:33:45
你需要使用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发布于 2014-06-06 16:36:02
编辑-
我完全错了。下面的Blam给了你真正的答案。抱歉!
原始员额:
考虑到任意数量的域(和时间),我恐怕不知道如何在SQL中做到这一点。您将需要结果集中的第N行来设置选择行N+1的条件,而这是无法做到的。在有限的域/时间下,您可能可以使用UNPIVOT查询执行一些操作,但我认为您必须使用由程序生成的动态SQL - SQL,并且知道要处理的数据是什么。
如果这是正确的,那么在获得数据之后,您可能会浪费时间生成一个查询并运行(我看不出这将是一个有效的查询)。相反,将数据放入代码中的可搜索列表中,在代码中获取第一个,然后了解第一个是什么,第二个等等。
听起来像一个讨厌的代码,但正确的可搜索结构可能是有趣的工作。
对不起,我帮不上忙,但我不知道该怎么做。
https://stackoverflow.com/questions/24086144
复制相似问题