2

我在 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() 函数的东西

我需要以定时间隔运行此查询,TOP 1 预期结果是获取最早的行,如果存在,则域 > 上一行的域,或者以域 = 1 重新启动。

就像在域上的循环排序

4

3 回答 3

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
于 2014-06-06T16:33:45.400 回答
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)
于 2014-06-06T16:44:01.863 回答
0

编辑 -

我完全错了。下面的 Blam 给了你真正的答案。道歉!

原帖:

给定任意数量的域(和时间),恐怕我看不出如何在 SQL 中完成此操作。您需要结果集中的第 N 行来设置选择第 N+1 行的条件,但这是无法做到的。使用有限数量的域/时间,您可能能够使用 UNPIVOT 查询做某事,但我认为您必须使用动态 SQL - 由程序生成的 SQL,并且知道要处理的数据是什么。

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

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

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

于 2014-06-06T16:36:02.377 回答