Упорядочить по оператору с начальным значением в Round Robin Select

У меня есть таблица в 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.

Как циклическая сортировка по домену


person giammin    schedule 06.06.2014    source источник
comment
Может быть, я единственный, но какие результаты вы ожидаете? Я не понимаю проблемы ... Таким образом, ожидаемый порядок будет следующим: Самое раннее сообщение домена 1, затем самое раннее сообщение домена 2, затем самое раннее сообщение домена 3, затем начать сначала с доменом 1, получающим следующее самое раннее (ранее не обработанное? )   -  person xQbert    schedule 06.06.2014
comment
@xQbert да, извините за мой плохой английский. Я хочу, чтобы после получения самого раннего сообщения домена 1 я хотел получить самое раннее сообщение, начиная с домена 2.   -  person giammin    schedule 06.06.2014
comment
Количество доменов ограничено? Или их будет произвольное количество?   -  person simon at rcl    schedule 06.06.2014
comment
@simonatrcl произвольный   -  person giammin    schedule 06.06.2014


Ответы (3)


Вам нужно использовать 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
person paparazzo    schedule 06.06.2014
comment
если я установлю recID = 2, первым результатом будет домен 1. Он должен быть самым ранним из доменов = 2 или следующим - person giammin; 06.06.2014
comment
Я понимаю, что английский является вторым языком, но вы не понимаете. Вы пробовали это? recID = 2 будет второй датой из каждого домена - person paparazzo; 06.06.2014
comment
Мне нужно выбрать более раннюю дату с доменом рядом с ранее выбранной строкой. Это происходит в 2 разных времени. - person giammin; 06.06.2014
comment
Я запускаю запрос и получаю первую строку. Затем я снова запускаю запрос, и мне нужна более ранняя строка с доменом рядом с предыдущей строкой. - person giammin; 06.06.2014
comment
Я не понимаю, но у тебя есть ответ - person paparazzo; 06.06.2014

Спасибо, ребята, за ваши усилия, но я думаю, что нашел решение:

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)
person giammin    schedule 06.06.2014

РЕДАКТИРОВАТЬ -

Я был совершенно неправ. Ниже Блам дал вам то, что действительно похоже на ответ. Извинения!

Исходный пост:

Учитывая произвольное количество доменов (и время), я не понимаю, как это можно сделать в SQL, я боюсь. Вам понадобится строка N в результирующем наборе, чтобы установить условия для выбора строки N+1, а это невозможно сделать. С ограниченным количеством доменов/времен вы можете что-то сделать с запросом UNPIVOT, но я думаю, вам придется использовать динамический SQL - SQL, сгенерированный программой, со знанием того, какие данные должны быть обработаны.

Если это так, то вы, вероятно, тратите время на создание запроса и выполнение (я не понимаю, как это может быть эффективным запросом) после того, как вы получили данные. Вместо этого поместите данные в некоторый список с возможностью поиска в коде, а в коде получите первое, затем, зная, что такое первое, получите второе и т. д. и т. д.

Звучит как неприятный кусок кода, но правильная поисковая структура может быть забавной.

Извините, я не могу быть более полезным, но я просто не понимаю, как это можно сделать.

person simon at rcl    schedule 06.06.2014