Как присоединиться, чтобы получать результаты в день без циклов в хранимой процедуре - PullRequest
2 голосов
/ 05 ноября 2011

Мне очень жаль.Я не правильно задал вопрос.Итак, вот снова:

У меня есть таблица, содержащая количество сообщений, их места назначения и даты их получения.То, что я хочу сделать, это для диапазона дат и для каждой даты в диапазоне найти последнее количество сообщений для каждого пункта назначения, который предшествует дате.Это должно быть сделано в хранимой процедуре, а не в цикле по диапазону дат.Является ли это возможным?Спасибо.

Например:

Destination  RetrievalDate       NumberOfPosts
-----------  ------------------  -------------
A            11/1/2011 12:00 AM  1
A            11/1/2011 1:00 AM   5
A            11/1/2011 5:00 AM   6
B            11/1/2011 12:00 AM  0
B            11/1/2011  4:00 AM  2
C            10/20/2011 5:00PM   1
A            11/2/2011 12:00 AM  8
A            11/2/2011 2:00 AM   9
B            11/2/2011 12AM      3

Например, в приведенной выше таблице, если диапазон дат от 01.11.2011 до 03.11.2011, я бы получил

Destination  ReportDate  NumberOfPosts
-----------  ----------  -------------
A            11/1/2011   6
B            11/1/2011   2
C            11/1/2011   1
A            11/2/2011   9
B            11/2/2011   3
C            11/2/2011   1
A            11/3/2011   9
B            11/3/2011   3
C            11/3/2011   1

1 Ответ

2 голосов
/ 05 ноября 2011

После редактирования вы можете использовать

declare @start date = '20111101'
declare @end date = '20111103';

WITH Dates(D)
     AS (SELECT @start
         UNION ALL
         SELECT DATEADD(DAY, 1, D)
         FROM   Dates
         WHERE  DATEADD(DAY, 1, D) <= @end),
     Destinations
     As (SELECT DISTINCT Destination
         FROM   YourTable)
SELECT CA.Destination,
       CA.[Number of posts],
       dt.D AS ReportDate
FROM   Destinations dst
       CROSS JOIN Dates dt
       CROSS APPLY (SELECT TOP 1 *
                    FROM   YourTable y
                    WHERE  dst.Destination = y.Destination
                           AND y.[Retrieval Date] <= DATEADD(DAY, 1, dt.D)
                    ORDER  BY y.[Retrieval Date] DESC) CA  

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...