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

Откуда: Москва
Сообщений: 96
Доброго дня,
Нужна помощь в составлении запроса.
Есть таблица:
CREATE TABLE [dbo].[Test] (
[Id] int IDENTITY(1, 1) NOT NULL,
[LineId] int NOT NULL,
[CategoryId] int NOT NULL)
ON [PRIMARY]

IdLineIdCategoryId
113
213
325
425
6118
10111


В поле LineId могут быть только два значения: 1 или 2.
Значения CategoryId - произвольные.

Нужно вывести информацию по последней категории в каждой линии: LineId, CategoryId, Quantity(количество записей с этой категорией). Последними являются записи с бОльшими Id.
Итог выполнения должен быть такой:

LineId CategoryId Quantity
1111
252
12 апр 17, 10:49    [20392902]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Добрый Э - Эх
Guest
Сергей Шелест,

Простая задача...
12 апр 17, 10:56    [20392939]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Сергей Шелест
Member

Откуда: Москва
Сообщений: 96
Добрый Э - Эх
Сергей Шелест,

Простая задача...


Спасибо. Посмотрю.
12 апр 17, 11:22    [20393102]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Сергей Шелест
Member

Откуда: Москва
Сообщений: 96
Добрый Э - Эх
Сергей Шелест,

Простая задача...


К сожалению это лишь частичное решение. Оно позволяет узнать Id последнего ящика для каждой линии.
Это я и сам сделал. Проблема заключается в подсчете значений третьей колонки: количество подряд идущих ящиков с этой(последнего ящика) категорией.

MS SQL 2014.
12 апр 17, 13:46    [20394092]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Сергей Шелест
Добрый Э - Эх
Сергей Шелест,

Простая задача...


К сожалению это лишь частичное решение. Оно позволяет узнать Id последнего ящика для каждой линии.
Это я и сам сделал. Проблема заключается в подсчете значений третьей колонки: количество подряд идущих ящиков с этой(последнего ящика) категорией.

MS SQL 2014.

COUNT(..) OVER (PARTITION...)
12 апр 17, 13:52    [20394113]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
WITH T AS
(
 SELECT * FROM
 (
  VALUES
  (1,1,3)
 ,(2,1,3)
 ,(3,2,5)
 ,(4,2,5)
 ,(6,1,18)
 ,(10,1,11)
 ) U(Id,LineId,CategoryId)
)
,Data AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY LineId ORDER BY Id DESC),GN=ROW_NUMBER()OVER(ORDER BY Id)-ROW_NUMBER()OVER(PARTITION BY LineId ORDER BY Id),* FROM T)
,Result AS(SELECT N,GN,Id,LineId,CategoryId,Quantity=COUNT(*)OVER(PARTITION BY GN,LineId) FROM Data)
SELECT Id,LineId,CategoryId,Quantity FROM Result WHERE N=1 ORDER BY Id;
12 апр 17, 14:33    [20394287]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Сергей Шелест
Member

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

Я именно в этой области по самые уши и нахожусь.
У меня никак не получается получить нумерацию в секциях с 1, если в той же линии Категории идут не подряд.
Пример:
IdLineIdCategoryId
113
213
325
415
613
10111

В следующей таблице "Number1" - это то, что получается у меня сейчас, "Number2" - то, что хотелось бы.
IdLineIdCategoryId Number1 Number2
11311
21322
32511
41511
61331
1011111

то есть SQL считает его третьим(и в принципе справедливо делает), а для меня он должен быть первым, так как до него была другая категория.
12 апр 17, 14:35    [20394296]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Сергей Шелест
Member

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

Неверные данные выдает.
Для LineId = 1 Quantity должно быть = 1. В итогах запроса Quantity = 2.
12 апр 17, 14:38    [20394309]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Сергей Шелест
iap,

Неверные данные выдает.
Для LineId = 1 Quantity должно быть = 1. В итогах запроса Quantity = 2.
WITH T AS
(
 SELECT * FROM
 (
  VALUES
  (1,1,3)
 ,(2,1,3)
 ,(3,2,5)
 ,(4,2,5)
 ,(6,1,18)
 ,(10,1,11)
 ) U(Id,LineId,CategoryId)
)
,Data AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY LineId ORDER BY Id DESC),GN=ROW_NUMBER()OVER(ORDER BY Id)-ROW_NUMBER()OVER(PARTITION BY LineId ORDER BY Id),* FROM T)
,Result AS(SELECT N,GN,Id,LineId,CategoryId,Quantity=COUNT(*)OVER(PARTITION BY GN,LineId,CategoryId) FROM Data)
SELECT Id,LineId,CategoryId,Quantity FROM Result WHERE N=1 ORDER BY Id;
12 апр 17, 14:42    [20394343]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
Сергей Шелест
Member

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

Огромное спасибо. Пойду осмысливать. :)
12 апр 17, 14:45    [20394360]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом. Группировка с секционированием.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Сергей Шелест
iap,

Огромное спасибо. Пойду осмысливать. :)
Заодно тщательно проверьте на других возможных данных.
А то мало ли что...
12 апр 17, 14:47    [20394373]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить