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

Откуда:
Сообщений: 9
Здравствуйте, много облазил, так и не нашел ответ на свой вопрос.
У меня есть таблица CatByAll

docid calcdate category
9448 2009-11-02 00:00:00.000 C
9848 2009-11-02 00:00:00.000 C
9848 2009-11-09 00:00:00.000 A
9848 2009-11-09 10:00:00.000 B
9848 2009-10-30 16:12:31.780 A
9850 2009-10-30 16:12:31.780 A
9853 2009-10-30 16:12:31.780 A

Мне нужно получить:
docid calcdate category
9448 2009-11-02 00:00:00.000 C
9848 2009-11-09 10:00:00.000 B
9850 2009-10-30 16:12:31.780 A
9853 2009-10-30 16:12:31.780 A

То есть запрос был примерно таким

Select docid, max(calcdate),category
From CatByAll
Group by docid

Но как сделать так чтобы он по category не вел группировку, а вставлял значения
соответствующие docid и максимальному calcdate?
9 ноя 09, 10:30    [7900053]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
если 2005+ смотрите на row_number()
--------------------------------------------------------------
Дьявол кроется в деталях.
9 ноя 09, 10:35    [7900081]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Krakaz,

решение зависит от версии сервера.
Строк с датами, равными максимальной, может быть несколько. Что в таком случае надо выбирать?
9 ноя 09, 10:37    [7900094]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
Krakaz
Member

Откуда:
Сообщений: 9
Дедушка
если 2005+ смотрите на row_number()
--------------------------------------------------------------
Дьявол кроется в деталях.


Сервер MSSQL 2005

Нет, может быть только одна строка с docid и датой. То есть если уже есть строка, допустим:
9848 09,11,2009 10:44:00 А

То второй такой же страки быть не может. Следующая запись по этому docid будет позже, то есть с
большей датой и временем
9 ноя 09, 10:43    [7900136]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WITH CTE AS(SELECT *, ROW_NUMBER()OVER(PARTITION BY docid ORDER BY calcdate DESC) N FROM CatByAll)
SELECT docid, calcdate, category
FROM CTE
WHERE N=1
ORDER BY docid;
9 ноя 09, 10:48    [7900176]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
aleks2
Guest
Select docid, max(calcdate), (select TOP 1 category FROM CatByAll X WHERE X.calcdate=calcdate AND X.docid=T.docid) category 
From CatByAll T
Group by docid
9 ноя 09, 10:51    [7900191]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
Krakaz
Member

Откуда:
Сообщений: 9
Спасибо большое :) Сработало!!!!!!!
3 дня бился с этой проблемой, а вы мне меньше чем за пол часа все показали!!!
Прям огромное спасибо вам!!!
9 ноя 09, 10:52    [7900196]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
aleks2
Guest
Пардон...
Select docid, max(calcdate), (select TOP 1 X.category FROM CatByAll X WHERE X.calcdate=max(T.calcdate) AND X.docid=T.docid) category 
From CatByAll T
Group by docid
9 ноя 09, 10:53    [7900201]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
DECLARE @t TABLE ([docid] int, [calcdate] DateTime, [category] VARCHAR(8)) 

INSERT INTO @t([docid], [calcdate], [category])
SELECT 9448,'20091102','C' UNION ALL
SELECT 9848,'20091102','C' UNION ALL
SELECT 9848,'20091109','A' UNION ALL
SELECT 9848,'20091109','B' UNION ALL
SELECT 9848,'20091030','A' UNION ALL
SELECT 9850,'20091030','A' UNION ALL
SELECT 9853,'20091030','A'


;WITH CTE AS(SELECT ROW_NUMBER()OVER(PARTITION BY docid,calcdate ORDER BY calcdate) N,* FROM @t)
SELECT N,docid,calcdate,category FROM CTE WHERE N<2

?

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
9 ноя 09, 10:53    [7900203]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT TOP(1) WITH TIES *
FROM CatByAll
ORDER BY ROW_NUMBER()OVER(PARTITION BY docid ORDER BY calcdate DESC);
9 ноя 09, 10:55    [7900223]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
;WITH CTE AS(SELECT ROW_NUMBER()OVER(PARTITION BY docid ORDER BY calcdate DESC) N,* FROM @t)
SELECT docid,calcdate,category FROM CTE WHERE N<2

Конечно же…

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
9 ноя 09, 11:03    [7900258]     Ответить | Цитировать Сообщить модератору
 Re: Использование Group by  [new]
alx111
Member

Откуда:
Сообщений: 92
select docid, convert(datetime, left(_str,19)) calcdate, right(_srt,len(_str)-19) category
from (
	Select docid, max(convert(varchar,calcdate, 120)+category) _srt
	From CatByAll
	Group by docid) a
9 ноя 09, 12:09    [7900678]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить