Как сгруппировать по идентификатору, а также по дате с этим запросом

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

DECLARE @StartDateTime datetime = '2015-07-13 14:00:00',
        @EndDateTime datetime = '2015-07-13 16:00:00';

WITH JumpsOf15 AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY object_id) * 15 AS Step
    FROM sys.objects
),
Dates as
(
SELECT currentDate = steppedDate.steppedDate
FROM JumpsOf15
CROSS APPLY(SELECT DATEADD(MINUTE,Step,@StartDateTime) AS steppedDate ) AS steppedDate
WHERE @EndDateTime>steppedDate.steppedDate 
)

SELECT  d.currentDate, t.Value, t.FK_ConfigId
FROM    Dates AS d
        OUTER APPLY
        (   SELECT  TOP 1 t.[Timestamp], t.Value, t.FK_ConfigId
            FROM    myTable AS t
            WHERE   t.[Timestamp] <= d.currentDate and t.FK_ConfigId in (208812, 208809, 208815)
            ORDER BY t.[Timestamp] DESC, t.Value, t.FK_ConfigId
        ) AS t

Это дает такой вывод:

currentDate          value           FK_ConfigId
1/1/2015 12:15       2               208809
1/1/2015 12:30       5               208815
1/1/2015 12:45       1               208815

Но на самом деле мне нужно иметь одну запись на метку времени для каждого уникального FK_ConfigId, который я указываю в списке. Прямо сейчас я получаю только одну запись на отметку времени независимо от идентификатора конфигурации. Результат, который я хочу:

currentDate          value           FK_ConfigId
1/1/2015 12:15       2               208809
1/1/2015 12:15       4               208815
1/1/2015 12:30       5               208809
1/1/2015 12:30       1               208815

Как я мог этого добиться?


person eddie_cat    schedule 14.07.2015    source источник
comment
Начните с удаления top 1 в своем последнем внешнем приложении, посмотрите, что это вам даст.   -  person Andrew    schedule 14.07.2015
comment
Мне нужен верхний 1, потому что может быть несколько строк для каждого configId для каждой временной метки, которая мне нужна. В реальных данных это не так аккуратно, например, я могу иметь значения 12:16:14 и 12:16:13, но я хочу отобразить 12:15:00 и просто взять ближайшее.   -  person eddie_cat    schedule 14.07.2015
comment
у вас нет предложения GROUP BY в запросе   -  person Vamsi Prabhala    schedule 14.07.2015
comment
Вам нужно будет group by FK_ConfigId ,currentDate, а затем вам нужно будет решить, какое «значение» взять (минимальное, максимальное и т. д.).   -  person Andrew    schedule 14.07.2015
comment
@Андрей спасибо. Я только что понял это, а затем прочитал ваш комментарий, лол, который на самом деле сказал мне вынуть Top 1, заставил меня снова взглянуть на данные и понять, что мне нужна группировка. Теперь я чувствую себя глупо. ›.‹   -  person eddie_cat    schedule 14.07.2015


Ответы (1)


Попробуйте это и скажите мне, что вы думаете:

DECLARE @StartDateTime datetime = '2015-07-13 14:00:00',
        @EndDateTime datetime = '2015-07-13 16:00:00';

WITH JumpsOf15 AS (
   SELECT Step = Row_Number() OVER (ORDER BY (SELECT 1)) * 15
   FROM sys.objects
),
Dates AS (
   SELECT currentDate = DateAdd(minute, Step, @StartDateTime)
   FROM JumpsOf15
   WHERE Step < DateDiff(minute, 0, @EndDateTime - @StartDateTime)
)
SELECT
   d.currentDate,
   t.ConfigId,
   t.Value
FROM
   Dates d
   CROSS JOIN (VALUES
      (208812), (208809), (208815)
   ) c (ConfigId)
   OUTER APPLY (
      SELECT TOP 1
          t.[Timestamp],
          t.Value,
          t.FK_ConfigId
      FROM myTable t
      WHERE
         d.currentDate >= t.[Timestamp]
         AND c.ConfigId = t.FK_ConfigId
      ORDER BY
         t.[Timestamp] DESC,
         t.Value
   ) t
;
person ErikE    schedule 22.07.2015