как обойти проблемы с группировкой, агрегированием

У меня есть следующий запрос:

SELECT d.currentDate, t.ConfigId, t.value as value
FROM    #Dates AS d
        OUTER APPLY
        (   SELECT  t.value as value, t.FK_ShipDataSubsystemConfigId
            FROM    myTable AS t
            WHERE   t.[Timestamp] <= d.currentDate and t.ConfigId in (' + @IDList + ')
            and t.FK_DataSystemId <> 1
        ) AS t 
GROUP BY d.currentDate, t.ConfigId
)

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

Моя проблема связана с предложением group by. Запрос не работает как есть, потому что value не входит в group by или агрегатную функцию. Я попытался сгруппировать по value также, чтобы ошибка исчезла, но она просто дает мне каждую отдельную дату в интервале, который я выбираю, в соответствии с каждым отдельным значением - не то, что я хочу. В итоге у меня должна получиться таблица с одной строкой для каждой пары дата/ConfigId.

Когда я удаляю значение из select и просто получаю дату и ConfigId, все работает нормально. Я получаю точное количество строк, которые я должен получить.

Таблица, которую я извлекаю, выглядит так:

PK_DataId    Timestamp        value     ConfigId
1            1/1/2015 12:00   234       5
2            1/1/2015 12:01   456       4

Я ожидаю получить обратно это:

Timestamp            value        ConfigId
1/1/2015 12:00:00    234          5
1/1/2015 12:00:00    456          4

Где у меня есть значение для каждой пары configId/date каждые пятнадцать минут. Когда я добавляю max(value), я каждый раз получаю только одно значение, а не разные. Когда я группирую по значению, я получаю миллионы строк, похоже, что я получаю одну строку для каждой временной метки, совпадающей с каждым значением из любой другой временной метки. Я не очень понимаю, что происходит.

Как я могу получить эти результаты, выбрав value?


person eddie_cat    schedule 16.07.2015    source источник
comment
Попробуйте добавить функцию aggregate в столбец value.   -  person Vamsi Prabhala    schedule 16.07.2015
comment
Какое значение вы хотите? Или вы ищете какой-то список, разделенный запятыми?   -  person James Z    schedule 16.07.2015
comment
Вы говорите, что вам не нужны все значения value, но вы не говорите, какое значение value вам нужно нужно. Так что это? Самый высокий? Самый низкий? Средний?   -  person Bacon Bits    schedule 16.07.2015
comment
Аминь на комментарий @BaconBits. И некоторые образцы данных были бы хороши.   -  person    schedule 16.07.2015
comment
Google и узнайте о GROUP BY и агрегатных функциях в SQL Server.   -  person Tab Alleman    schedule 16.07.2015


Ответы (2)


Если я правильно понимаю, вы просто хотите top 1 в apply:

SELECT d.currentDate, t.ConfigId, t.value as value
FROM #Dates d OUTER APPLY
     (SELECT  TOP 1 t.value as value, t.FK_ShipDataSubsystemConfigId
      FROM    myTable AS t
      WHERE   t.[Timestamp] <= d.currentDate and
              t.ConfigId in (' + @IDList + ') and
              t.FK_DataSystemId <> 1
     ORDER BY t.[Timestamp] DESC
    ) t ;

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

Если вам нужна одна строка для каждого config и времени:

SELECT d.currentDate, t.ConfigId, t.value as value
FROM #Dates d CROSS JOIN
     (SELECT DISTINCT FK_ShipDataSubsystemConfigId
      FROM myTable
      WHERE t.ConfigId in (' + @IDList + ')
     ) c OUTER APPLY
     (SELECT  TOP 1 t.value as value, t.FK_ShipDataSubsystemConfigId
      FROM    myTable AS t
      WHERE   t.[Timestamp] <= d.currentDate and
              t.ConfigId = c.FK_ShipDataSubsystemConfigId and
              t.FK_DataSystemId <> 1
      ORDER BY t.[Timestamp] DESC
     ) t ;

Та же основная идея, но для этого необходимо сгенерировать все строки для всех конфигураций и дат до outer apply.

person Gordon Linoff    schedule 16.07.2015
comment
Это ближе, теперь я получаю другие значения. Но я получаю только одну строку каждый раз, когда у меня должна быть одна строка для каждого времени/configId. - person eddie_cat; 16.07.2015