2013-08-07 2 views
0

У меня проблема с этим (с использованием SQL Server 2005).Как группировать меньше столбцов, чем выбрано

Мой SELECT запрос выглядит следующим образом:

SELECT 
a.str_column1, b.str_column2, c.date_column3, c.guid_column4 
FROM table 
.... 
joining the other tables here to get my columns 
.... 
GROUP BY 
    a.str_column1, b.str_column2, c.date_column3, c.guid_column4 

Это даст что-то вроде этого

a.str_column1 b.str_column2 c.date_column3 c.guid_column4 
------------------------------------------------------------------ 
a1    b1    15/07/2013  someID  
a2    b2    05/06/2012  someID 
a1    b1    07/08/2013  someID 
.... 

Теперь я хочу, так что это сгруппированные по a.str_column1 и b.str_column2, только получать самую последнюю один (order by c.dat_column3)

a.str_column1 b.str_column2 c.date_column3 c.guid_column4 
------------------------------------------------------------------ 
a1    b1    07/08/2013  someID 
a2    b2    05/06/2012  someID 

Любая идея, как я могу выполнить это с помощью SQL?

ответ

4

Вы можете использовать ROW_NUMBER(), и может быть в состоянии устранить GROUP BY целиком:

SELECT 
    * 
FROM (
    SELECT 
    a.str_column1, b.str_column2, c.date_column3, c.guid_column4, 
    ROW_NUMBER() OVER (PARTITION BY a.str_column1, b.str_column2 
        ORDER BY c.date_column3 DESC) as rn 
    FROM table 
    .... 
    joining the other tables here to get my columns 
    .... 
    --No longer needed GROUP BY a.str_column1, b.str_column2, c.date_column3, c.guid_column4 
) t 
WHERE t.rn = 1 

Чтобы иметь возможность запрашивать результат функции ROW_NUMBER(), вам необходимо разместить существующий запрос (с новым столбцом в списке SELECT) в к подзапросу (как указано выше) или к выражению общей таблицы.

+0

Мне нравится этот ответ. Мне никогда не приходилось использовать 'OVER' /' PARTITION BY', есть ли сайт, который вы можете почитать, или вы просто запустите описание MSDN? – seph

+0

@seph - страница MSDN - это все, к чему я обычно связываю людей. –

0

Вы sholud использовать max функцию date_column3 столбца и удалить столбец из группы по п ниже

SELECT 
a.str_column1, b.str_column2, max(c.date_column3) as column3, c.guid_column4 
FROM table 
.... 
joining the other tables here to get my columns 
.... 
GROUP BY a.str_column1, b.str_column2,c.guid_column4 
+0

Хотя неясно из данных образца, я считаю, что 'guid_column4' не будет постоянным на' str_column1, str_column2'. Я считаю, что намерение состоит в том, чтобы получить последнюю «guid_column4» и соответствующую дату – Tobsey

Смежные вопросы