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

Откуда:
Сообщений: 864
Здравствуйте.
Помогите пожалуйста с запросом:

Есть таблица
tp_Modified tp_ID tp_WorkflowInstanceID tp_Version
2018-04-11 03:59:26.000 19818 7EB9C078-E0B9-4B8A-8576-4081B196004C 2
2018-04-11 03:59:26.000 19804 7EB9C078-E0B9-4B8A-8576-4081B196004C 4
2018-03-26 11:14:21.000 19476 CEA9B396-AF0F-461C-A2F5-4167D15EC35E 2
2017-11-29 10:51:32.000 17577 6005A2AE-8713-422B-8B9A-472B3D89BA57 2
2017-11-29 10:56:13.000 17577 6005A2AE-8713-422B-8B9A-472B3D89BA57 3
2017-12-08 05:47:11.000 17728 6005A2AE-8713-422B-8B9A-472B3D89BA57 4
2017-12-07 05:27:01.000 17745 6005A2AE-8713-422B-8B9A-472B3D89BA57 2
2017-12-08 09:46:10.000 17745 6005A2AE-8713-422B-8B9A-472B3D89BA57 4
2017-12-11 06:45:44.000 17745 6005A2AE-8713-422B-8B9A-472B3D89BA57 5
2017-12-11 06:45:47.000 17745 6005A2AE-8713-422B-8B9A-472B3D89BA57 6
2017-12-08 09:46:10.000 17779 6005A2AE-8713-422B-8B9A-472B3D89BA57 2


Нужно вывести только те записи, где среди повторяющихся tp_ID, - tp_Modified максимальный. Т.е. результат должен быть таким:
tp_Modified tp_ID tp_WorkflowInstanceID tp_Version
2018-04-11 03:59:26.000 19818 7EB9C078-E0B9-4B8A-8576-4081B196004C 2
2018-04-11 03:59:26.000 19804 7EB9C078-E0B9-4B8A-8576-4081B196004C 4
2018-03-26 11:14:21.000 19476 CEA9B396-AF0F-461C-A2F5-4167D15EC35E 2
2017-11-29 10:56:13.000 17577 6005A2AE-8713-422B-8B9A-472B3D89BA57 3
2017-12-08 05:47:11.000 17728 6005A2AE-8713-422B-8B9A-472B3D89BA57 4
2017-12-11 06:45:47.000 17745 6005A2AE-8713-422B-8B9A-472B3D89BA57 6
2017-12-08 09:46:10.000 17779 6005A2AE-8713-422B-8B9A-472B3D89BA57 2
13 апр 18, 14:22    [21336875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
версия сервера?
13 апр 18, 14:27    [21336900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
MAULER
Member

Откуда:
Сообщений: 864
Дедушка,

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) Jun 17 2016 19:14:09 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
13 апр 18, 14:30    [21336915]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
читать про OVER в связке с ROW_NUMBER или MAX
13 апр 18, 14:56    [21337063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
assmsk
Member

Откуда:
Сообщений: 169
Если данных не много можете заджойнить вашу таблицу с (select tp_id , max(tp_modified) tp_modified from table group by tp_id) on tp_id = tp_id and tp_modified = tp_modified
13 апр 18, 16:33    [21337569]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
marsyakupov
Member

Откуда:
Сообщений: 3
DECLARE @table TABLE
([tp_Modified] DATETIME NOT NULL
,[tp_ID] INT NOT NULL
,[tp_WorkflowInstanceID] [nvarchar](50) NOT NULL
,[tp_Version] [int] NOT NULL )
INSERT INTO @table
VALUES
(CONVERT(DATETIME,'2018-04-11 03:59:26.000',121),19818,'7EB9C078-E0B9-4B8A-8576-4081B196004C',2),
(CONVERT(DATETIME,'2018-04-11 03:59:26.000',121),19804,'7EB9C078-E0B9-4B8A-8576-4081B196004C',4),
(CONVERT(DATETIME,'2018-03-26 11:14:21.000',121),19476,'CEA9B396-AF0F-461C-A2F5-4167D15EC35E',2),
(CONVERT(DATETIME,'2017-11-29 10:51:32.000',121),17577,'6005A2AE-8713-422B-8B9A-472B3D89BA57',2),
(CONVERT(DATETIME,'2017-11-29 10:56:13.000',121),17577,'6005A2AE-8713-422B-8B9A-472B3D89BA57',3),
(CONVERT(DATETIME,'2017-12-08 05:47:11.000',121),17728,'6005A2AE-8713-422B-8B9A-472B3D89BA57',4),
(CONVERT(DATETIME,'2017-12-07 05:27:01.000',121),17745,'6005A2AE-8713-422B-8B9A-472B3D89BA57',2),
(CONVERT(DATETIME,'2017-12-08 09:46:10.000',121),17745,'6005A2AE-8713-422B-8B9A-472B3D89BA57',4),
(CONVERT(DATETIME,'2017-12-11 06:45:44.000',121),17745,'6005A2AE-8713-422B-8B9A-472B3D89BA57',5),
(CONVERT(DATETIME,'2017-12-11 06:45:47.000',121),17745,'6005A2AE-8713-422B-8B9A-472B3D89BA57',6),
(CONVERT(DATETIME,'2017-12-08 09:46:10.000',121),17779,'6005A2AE-8713-422B-8B9A-472B3D89BA57',2)

;WITH T AS
(
SELECT MAX(tp_Modified) AS tp_Modified2
,Tp_ID AS Tp_ID2
FROM @table
GROUP BY
Tp_ID
)

SELECT [tp_Modified]
,[tp_ID]
,[tp_WorkflowInstanceID]
,[tp_Version]
FROM @table
INNER JOIN T
ON T.Tp_ID2 = [tp_ID]
AND T.tp_Modified2 = [tp_Modified]
13 апр 18, 20:18    [21338090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
MAULER,

Слушайте Дедушку. Два вышестоящих поста игнорируйте
ЗЫ:
with t as
(select [tp_ID], [tp_Modified],
rank() over (partition by [tp_ID] order by [tp_Modified] desc) as r
from @table )
select * from t where r=1
13 апр 18, 21:35    [21338187]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
Glebanski
MAULER,

Слушайте Дедушку. Два вышестоящих поста игнорируйте
ЗЫ:
with t as
(select [tp_ID], [tp_Modified],
rank() over (partition by [tp_ID] order by [tp_Modified] desc) as r
from @table )
select * from t where r=1
А чем плохи два вышестоящих поста? Работать будет даже на древнем сервере.

#Хэш=
14 апр 18, 14:02    [21339145]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
04cf9f9576a6f15,

В данном случае "громоздкий старомодный код" vs "современный элегантный".
15 апр 18, 19:53    [21341049]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
MAULER
Member

Откуда:
Сообщений: 864
Коллеги,
благодарю за помощь!

Я был очень близко к вашему варианту, только я применил не Rank() а Row_Number() и не догадался отсортировать по убыванию в поднаборе и "выхватывать" первую строку.
16 апр 18, 07:56    [21341432]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
MAULER
Member

Откуда:
Сообщений: 864
У меня сейчас другая беда. Надо из таблицы:

tp_WorkflowInstanceID tp_Version
C6AB4139-4F5E-41DB-8DA8-0947C31488CA 4
C6AB4139-4F5E-41DB-8DA8-0947C31488CA 4
C6AB4139-4F5E-41DB-8DA8-0947C31488CA 2
C6AB4139-4F5E-41DB-8DA8-0947C31488CA 2
C6AB4139-4F5E-41DB-8DA8-0947C31488CA 4
908606BA-EB87-4BB9-8104-194A1BBCC500 4
908606BA-EB87-4BB9-8104-194A1BBCC500 4
908606BA-EB87-4BB9-8104-194A1BBCC500 6
908606BA-EB87-4BB9-8104-194A1BBCC500 6
908606BA-EB87-4BB9-8104-194A1BBCC500 4
908606BA-EB87-4BB9-8104-194A1BBCC500 6
68C7164C-10AD-4CB2-A0FE-28C5EA976575 4
68C7164C-10AD-4CB2-A0FE-28C5EA976575 4
68C7164C-10AD-4CB2-A0FE-28C5EA976575 4
37BAC7E0-A855-4F36-8E52-311EC0C30B04 2


Отобрать только те записи, где повторяющийся tp_WorkflowInstanceID содержит одни четверки!

Т.е. в результате должна отобраться одна запись:
tp_WorkflowInstanceID tp_Version
68C7164C-10AD-4CB2-A0FE-28C5EA976575 4


Моя идея в том, чтобы вывести рядом в ещё одном столбце общее количество записей в подгруппе и тут же количество 4-рок.
Если количество записей в подгруппе = количеству 4-рок - выводить эту запись.

Как вывести общее количество в подгруппе я знаю:
select tp_WorkflowInstanceID,
         tp_Version,
	 count(tp_WorkflowInstanceID) over (partition by tp_WorkflowInstanceID) as cnt
 from AllUserData
order by tp_WorkflowInstanceID


а как сделать чтобы рядом четверки подсчитывались - не могу сообразить ))
16 апр 18, 08:27    [21341447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
Massa52
Member

Откуда:
Сообщений: 373
MAULER,
и тут же кол-во 4
;WITH T AS
(
select tp_WorkflowInstanceID,
         tp_Version,
	 count(tp_WorkflowInstanceID) over (partition by tp_WorkflowInstanceID) as cnt
	 ,sum(CASE WHEN tp_Version = 4 THEN 1 ELSE 0 END) over (partition by tp_WorkflowInstanceID) as cnt4

 from @table
)
SELECT * FROM T order by tp_WorkflowInstanceID
16 апр 18, 08:43    [21341469]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать Select...  [new]
MAULER
Member

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

Вы практически читаете мои мысли)))

select tp_WorkflowInstanceID,
         tp_Version,	   
	 count(tp_WorkflowInstanceID) over (partition by tp_WorkflowInstanceID) as cnt,
	 count(case when tp_Version = 4 then 1 else null end) over (partition by tp_WorkflowInstanceID) as cnt4
 from AllUserData 
order by tp_WorkflowInstanceID


Благодарю!
16 апр 18, 08:49    [21341481]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить