Группировать по правильному использованию - PullRequest
0 голосов
/ 13 февраля 2012

TL; DR Как вернуть столбцы, не добавляя их в предложение GROUP BY в MSSQL? Ниже приводится уголовное заявление.

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

WITH UC AS
(
    SELECT OSJ.opportunityid, OS.status,
           ROW_NUMBER() OVER (PARTITION BY OSJ.opportunityid ORDER BY creationdate DESC) RN
    FROM Opportunitystatusjoin OSJ
    JOIN OpportunityStatus OS ON OSJ.opportunitystatusid = OS.opportunitystatusid
)
SELECT O.opportunityid , O.salesperson ,
    MAX( CASE 
        WHEN RN = 1
            THEN UC.status
        END ) AS MostRecent ,
    MAX( CASE 
        WHEN RN = 2
            THEN UC.status
        END ) AS SecondMostRecent
FROM Opportunity O
JOIN UC ON UC.opportunityid = O.opportunityid
WHERE UC.RN <= 2
GROUP BY O.opportunityid , O.salesperson

Теперь, если я хочу вернуть больше столбцов из таблицы Opportunity, т.е. O.shoesize, O.favorite_color, я должен добавить их в мое предложение GROUP BY. Но у меня просто возникает грязное чувство, потому что я не пытаюсь сгруппировать другие столбцы, я просто хочу, чтобы они появились с соответствующей возможностью.

В блоге, который я нашел в Интернете, говорится, что ваши предложения GROUP BY заполняются как можно дольше во вложенные варианты. Тем не менее, поскольку я использую первое утверждение («с UC ...»), оно, кажется, делает вещи менее интуитивно понятными. Что такое разумный способ включить другие столбцы из моей таблицы, не добавляя их в предложение GROUP BY.

1 Ответ

3 голосов
/ 13 февраля 2012

Если столбцы будут иметь одинаковое значение для всего, что вы группируете, то вы можете сделать что-то вроде этого:

SELECT col1, col2, MAX(col3) FROM table GROUP BY col1, col2
...