Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
Имеется большое количество полей, необходимо сгруппировать по двум полям Tab_N, NomN и найти среди этих групп строку с максимальной датой Max(dtEnd). Все это хорошо делает Group By, но при условии что используются только три поля. Я же хочу видеть все данные в других полях. Таблица одна "Dress", следующий запрос не работает:
15 ноя 17, 13:11    [20955748]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
SELECT *
FROM (Select Tab_N,NomN,Max(dtEnd)
From Dress
GROUP BY Tab_N,NomN)

Ошибка - Incorrect syntax near ')'.
15 ноя 17, 13:12    [20955751]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
DrinKins
SELECT *
FROM (Select Tab_N,NomN,Max(dtEnd)
From Dress
GROUP BY Tab_N,NomN)

Ошибка - Incorrect syntax near ')'.

Ну допустим у Вас на сочетание Tab_N и NomN только 1 строка на каждую дату dtEnd.
Тогда так
SELECT
	tt.[Tab_N]
	,tt.[NomN]
	,tt.[dtEnd]
	,tt.[another_column_1]
	,tt.[another_column_2]
	,tt.[another_column_3]
from
(
SELECT
	[Tab_N]
	,[NomN]
	,[dtEnd]
	,[another_column_1]
	,[another_column_2]
	,[another_column_3]
	,ROW_NUMBER() OVER PARTITION (GROUP BY [Tab_N],[NomN] ORDER BY [dtEnd] DESC) AS [Only_MaxDate_Row]
FROM [Dress]
) tt
where tt.[Only_MaxDate_Row] = 1
15 ноя 17, 13:25    [20955818]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
DrinKins,

Версию сервера выложите сюда. Если SQL 2005 - оконная функция Row_Number() не существует там.
Вот корректный вариант.
SELECT
	tt.[Tab_N]
	,tt.[NomN]
	,tt.[dtEnd]
	,tt.[another_column_1]
	,tt.[another_column_2]
	,tt.[another_column_3]
from
(
SELECT
	[Tab_N]
	,[NomN]
	,[dtEnd]
	,[another_column_1]
	,[another_column_2]
	,[another_column_3]
	,ROW_NUMBER() OVER (PARTITION BY [Tab_N],[NomN] ORDER BY [dtEnd] DESC) AS [Only_MaxDate_Row]
FROM [Dress]
) tt
where tt.[Only_MaxDate_Row] = 1
15 ноя 17, 13:29    [20955834]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Andy_OLAP
Если SQL 2005 - оконная функция Row_Number() не существует там
Правда? А мужики-то не знают! ©
Она появилась именно в SQL2005

Другое дело, непонятно, какой нужен результат.
DrinKins
необходимо сгруппировать по двум полям Tab_N, NomN и найти среди этих групп строку с максимальной датой Max(dtEnd).
Получается, нужна одна строка с глобально максимальным dtEnd?
Или сформулировать задачу по-русски.
15 ноя 17, 13:42    [20955897]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
Andy_OLAP,

Не вышло
15 ноя 17, 13:43    [20955905]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
15 ноя 17, 13:44    [20955910]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
iap,

Tab_N - уникальные номера людей, NomN - уникальные номера спецодежды(у одного человека их может быть несколько), dtEnd - дата замены это одежды, интересует такой запрос, чтобы по конкретному человеку(Tab_N) и конкретному номеру спецодежды (NomN) я мог увидеть запись с максимальной датой.
15 ноя 17, 13:49    [20955940]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iap
Andy_OLAP
Если SQL 2005 - оконная функция Row_Number() не существует там
Правда? А мужики-то не знают! ©
Она появилась именно в SQL2005

Есть под рукой 2005, но даже проверять не стал, поверю Вам на слово, коллега.
Хотя согласно MSDN SQL Server (starting with 2008). Но соглашусь - Аманта Кумар еще в 2006-м приводил в статье, как Row_Number работает.

Для SQL 2000:
SELECT
	t1.[Tab_N]
	,t1.[NomN]
	,t1.[dtEnd]
	,t1.[another_column_1]
	,t1.[another_column_2]
	,t1.[another_column_3]
from [Dress] t1
inner join
(
SELECT
	[Tab_N]
	,[NomN]
	,max([dtEnd]) as [dtEnd]
FROM [Dress]
GROUP BY
	[Tab_N]
	,[NomN]	
) t2 on t1.[dtEnd] = t2.[dtEnd]
15 ноя 17, 13:50    [20955951]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,

Копипаст последней строки не влез. Еще раз...
SELECT
	t1.[Tab_N]
	,t1.[NomN]
	,t1.[dtEnd]
	,t1.[another_column_1]
	,t1.[another_column_2]
	,t1.[another_column_3]
from [Dress] t1
inner join
(
SELECT
	[Tab_N]
	,[NomN]
	,max([dtEnd]) as [dtEnd]
FROM [Dress]
GROUP BY
	[Tab_N]
	,[NomN]	
) t2 on t1.[dtEnd] = t2.[dtEnd]
and t1.[Tab_N] = t2.[Tab_N] and t1.[NomN] = t2.[NomN]
15 ноя 17, 13:53    [20955976]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по двум полям, а отображение всех полей.  [new]
DrinKins
Member

Откуда:
Сообщений: 11
Andy_OLAP,

Вай вай, спасибо все получилось!
15 ноя 17, 14:11    [20956092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить