powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите найти значение окончания кадра (оптимизация запроса)
4 сообщений из 4, страница 1 из 1
Помогите найти значение окончания кадра (оптимизация запроса)
    #40071468
Sybex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, коллеги!

Есть таблица
ID1ID2MinVal1MaxVal1MinVal2MaxVal2DescriptionVal317701000NULLVal1 до 1001017710015003Val1 от 100 до 150; Val2 до 31117710015035Val1 от 100 до 150; Val2 от 3 до 5121771001505NULLVal1 от 100 до 150; Val2 от 51317715020003Val1 от 150 до 200; Val2 до 31417715020035Val1 от 150 до 200; Val2 от 3 до 5151771502005NULLVal1 от 150 до 200; Val2 от 516177200NULL0NULLVal1 от 200172770500NULLVal1 до 50527750NULL0NULLVal1 от 501017801000NULLVal1 до 10091781001500NULLVal1 от 100 до 150101781502000NULLVal1 от 150 до 20012178200NULL0NULLVal1 от 20015

Но в базе данных она хранится без полей MaxVal1, MaxVal2 и Description. Склейка столбца Description - это дело ясное, но мне нужно получить столбцы MaxVal1 и MaxVal2. Последний я могу получить довольно просто, но вот с MaxVal1 у меня вышел затык. Единственный вариант, который мне пришёл в голову - это соединение таблицы самой с собой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
DECLARE @T TABLE ([ID1] int NOT NULL, [ID2] int NOT NULL, [MinVal1] int NOT NULL, [MinVal2] int NOT NULL, [Val3] int NOT NULL)

INSERT @T
VALUES (1,77,0,0,10)
      ,(1,77,100,0,11)
      ,(1,77,100,3,12)
      ,(1,77,100,5,13)
      ,(1,77,150,0,14)
      ,(1,77,150,3,15)
      ,(1,77,150,5,16)
      ,(1,77,200,0,17)
      ,(2,77,0,0,5)
      ,(2,77,50,0,10)
      ,(1,78,0,0,9)
      ,(1,78,100,0,10)
      ,(1,78,150,0,12)
      ,(1,78,200,0,15);

SELECT [ID1]
      ,[ID2]
      ,[MinVal1]
      ,[MaxVal1]
      ,[MinVal2]
      ,LEAD([MinVal2],1) OVER(PARTITION BY [ID1], [ID2], [MinVal1] ORDER BY [MinVal2]) AS [MaxVal2]
      ,[Val3]
  FROM @T AS [T1]
       OUTER APPLY (SELECT TOP (1) [T2].[MinVal1] AS [MaxVal1]
                      FROM @T AS [T2]
                     WHERE [T1].[ID1] = [T2].[ID1] AND [T1].[ID2] = [T2].[ID2] AND [T1].[MinVal1] < [T2].[MinVal1]
                     ORDER BY [T2].[MinVal1]) AS [T2]
ORDER BY [ID2], [ID1], [MinVal1], [MinVal2]



Но на самом деле @T - это не таблица, а результат подзапроса, где до его получения уже происходит много чего. Я тут это в табличную переменную просто для упрощённого примера вывел. Так что мне хочется избавиться от этого соединения. Вот и думаю, может я где-то туплю и есть какой-то простой способ получения этого MaxVal1?

P.S. SQL Server 2019
...
Рейтинг: 0 / 0
Помогите найти значение окончания кадра (оптимизация запроса)
    #40071476
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sybex,

значения MaxVal1, MaxVal2 должны быть определены каким образом?
...
Рейтинг: 0 / 0
Помогите найти значение окончания кадра (оптимизация запроса)
    #40071480
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sybex,

в качестве иллюстрации:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
DECLARE @T TABLE ([ID1] int NOT NULL, [ID2] int NOT NULL, [MinVal1] int NOT NULL, [MinVal2] int NOT NULL, [Val3] int NOT NULL)

INSERT @T
VALUES (1,77,0,0,10)
      ,(1,77,100,0,11)
      ,(1,77,100,3,12)
      ,(1,77,100,5,13)
      ,(1,77,150,0,14)
      ,(1,77,150,3,15)
      ,(1,77,150,5,16)
      ,(1,77,200,0,17)
      ,(2,77,0,0,5)
      ,(2,77,50,0,10)
      ,(1,78,0,0,9)
      ,(1,78,100,0,10)
      ,(1,78,150,0,12)
      ,(1,78,200,0,15);

select [ID1]
      ,[ID2]
      ,[MinVal1]
      , nullif(max([LeadMinVal1]) over(partition by [ID1],[ID2] order by [MinVal1], [LeadMinVal1] desc),[MinVal1]) as [MaxVal1]
  from (
SELECT [ID1]
      ,[ID2]
      ,[MinVal1]
      ,nullif(lead([MinVal1]) over(partition by [ID1],[ID2] order by [MinVal1]),[MinVal1]) as [LeadMinVal1]
  FROM @T AS [T1]) v
 order by [ID2], [ID1]


А дальше - сами...
...
Рейтинг: 0 / 0
Помогите найти значение окончания кадра (оптимизация запроса)
    #40071490
Sybex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, спасибо большое! Это как раз то, что нужно!!!

Владислав Колосов
значения MaxVal1, MaxVal2 должны быть определены каким образом?

MaxVal1 - это значение MinVal1 из строки ниже (группировка по ID1 и ID2, сортировка по возрастанию MinVal1 с исключением дубликатов), соответственно MaxVal2 - это значение MinVal2 из строки ниже (группировка по ID1, ID2, MinVal1, сортировка по возрастанию MinVal2). Тяжело так объяснить, проще на таблице примере смотреть и в моём не оптимальном запросе.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите найти значение окончания кадра (оптимизация запроса)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]