SQL - агрегатная функция для получения значения из той же строки, что и MAX () - PullRequest
0 голосов
/ 12 июля 2010

У меня есть одна таблица со столбцами channel, value и timestamp, а другая таблица с 7 другими столбцами с различными данными.

Я соединяю эти два элемента вместе и хочу выбрать максимальное значение столбца значений в течение часа и отметку времени соответствующей строки. Это то, что я пробовал, но это (очевидно) не работает.

SELECT
    v.channel,
    MAX(v.value),
    v.timestamp,
    i.stuff,
    ...
FROM
    Values v
INNER JOIN
    @Information i
ON i.type = v.type
GROUP BY channel, DATEPART(HOUR, timestamp), i.stuff, ...

Я (не очень удивительно) получаю следующую ошибку:

«dbo.Values.timestamp» недопустимо в списке выбора, поскольку оно не содержится ни в статистической функции, ни в предложении GROUP BY

Как мне сделать это правильно?

Ответы [ 2 ]

3 голосов
/ 12 июля 2010

Вы можете использовать функции RANK () или DENSE_RANK () для получения соответствующих результатов. Что-то вроде:

;WITH RankedResults AS
(
    SELECT
        channel,
        value,
        timestamp,
        type,
        RANK() OVER (PARTITION BY DATEPART(hour,timestamp) ORDER BY value desc) as Position
    FROM
        Values
)
SELECT
   v.channel,
   v.value,
   v.timestamp,
   i.stuff
   /* other columns */
FROM
   RankedResults v
       inner join
   @Information i
       on
           v.type = i.type
WHERE
   v.Position = 1

(действительно ли использовать RANK или DENSE_RANK, зависит от того, что вы хотите сделать в случае связей)

(отредактировал SQL для включения объединения в ответ на комментарий Томаса)

0 голосов
/ 12 июля 2010

вы должны включить 'v.timestamp' в предложение Group By. Надеюсь, это поможет вам.

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