在循环选择中按起始值排序

时间:2014-06-06 16:01:22

标签: sql tsql sql-order-by round-robin

我在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] 

SqlFiddle

我需要说:

ORDER BY [domain] > @lastuseddomain

类似于mysql FIELD() function

的内容

我需要以TOP 1的定时间隔运行此查询 预期的结果是使用域>获得最早的行。上一行的域(如果存在)或使用domain = 1重新启动。

就像在域上进行循环排序一样

3 个答案:

答案 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,并知道要处理的数据是什么

如果这是正确的,那么在您获得数据后,您可能会浪费时间生成查询并运行(我无法查看它是如何成为有效的查询) 。相反,将数据放入代码中的一些可搜索列表中,然后在代码中获取第一个,然后知道第一个获取第二个等等。

听起来像一个令人讨厌的代码,但正确的可搜索结构可能很有趣。

抱歉,我不能提供更多帮助,但我不知道如何做到这一点。