Как я могу объединить агрегатные функции sql с более четкими? - PullRequest
1 голос
/ 30 сентября 2010

В последнее время я неоднократно сталкивался со следующим случаем, либо мне нужно применить MAX () или SUM () к одному столбцу таблицы, но мне нужны наборы значений DISTINCT для других столбцов.

Например, рассмотрим следующую таблицу и связанные столбцы, представляющие сведения о входе в систему в StackOverflow.

SoUserLogins (OpenIdToken, Name, IpAdress, LoginTimeStamp, QuestionsAsked)

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

SELECT DISTINCT
  OpenIdToken,
  MAX(LoginTimeStamp)
INTO #tmpLastLogin
FROM SoUserLogins
GROUP BY OpenIdToken

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

;WITH tmpLastLogin_CTE AS (
SELECT DISTINCT
  SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked
  TTL.LastLogin
FROM SoUserLogins SOL
JOIN #tmpLastLogin TLL ON SOL.OpenIdToken = TLL.OpenIdToken
)
--Extra SQL using tmpLastLogin_CTE goes here

Вы можете изменитьот MAX (LoginTimeStamp) до SUM (QuestionsAsked) в приведенном выше коде с несколькими дополнительными настройками, чтобы увидеть похожий пример.

Мой вопрос, есть ли более чистый или более элегантный способ справиться с этими ситуациями?

Я использую SQL Server.

Ответы [ 2 ]

7 голосов
/ 30 сентября 2010

Ты имеешь в виду это?

SELECT DISTINCT
  SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked,
  MAX(LoginTimeStamp) OVER (PARTITION BY OpenIdToken) AS LastLogin
FROM SoUserLogins SOL

То есть у вас будет несколько строк на OpenIdToken, и одно и то же значение LastLogin будет повторяться для всех строк в группе?

0 голосов
/ 30 сентября 2010

Если вы ниже База данных Oracle , вам следует рассмотреть возможность использования пользовательской * Аналитическая функция Oracle * что позволяет вам агрегировать данные по строкам в зависимости от столбца.

Когда я писал это, Мартин ответил.

Но некоторую документацию можно найти здесь (на французском)

...