按正确用法分组

时间:2012-02-13 15:46:09

标签: sql sql-server group-by aggregate

TL; DR如何在不将它们添加到MSSQL中的GROUP BY子句的情况下返回列?刑事陈述如下。

大家好,   所以我最近问了这个question,得到了一个很好的解决方案,我能够解剖和重组以解决我的问题。这是最终结果

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 个答案:

答案 0 :(得分:3)

如果您要分组的所有内容的列都是相同的值,那么您可以执行以下操作:

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