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

Откуда:
Сообщений: 5
Помогите решить задачку, неделю только изучаю T SQL, вторые сутки решить уже не могу!
Эт прст жесть )

--Приоритет 1
-- берем  данные, где задано isHighPriority = @HighPriorityID
-- если таких данных  (где задано isHighPriority = @HighPriorityID )больше одного, то берем данные, где   isFirst > 0
-- если таких данных (где  isFirst > 0) больше одного, то берем TOP 1  с самой старой датой CreateDate
--Приоритет 2
--иначе (Нет данных где isHighPriority = @HighPriorityID)
--если имеются записи с isFirst > 0, взять все записи с Max(isFirst)
-- если таких данных больше одного, то берем TOP 1  с самой старой датой CreateDate
--Приоритет 3
--иначе (Нет данных где isFirst > 0)
--берем TOP 1  с самой старой датой CreateDate

--Результат записать в @tableResult

DECLARE @HighPriorityID nvarchar(13) = N'АБВ1708280242';

DECLARE @table TABLE (ID int PRIMARY KEY NOT NULL IDENTITY(1, 1)
                                  ,keyGroup  int
                                  ,isHighPriority nvarchar(13)  NULL 
                                  ,isFirst bit
								  ,CreateDate date NOT NULL)

DECLARE @tableResult TABLE (ID int PRIMARY KEY NOT NULL IDENTITY(1, 1)
                                  ,keyGroup  int
                                  ,isHighPriority nvarchar(13)  NULL 
                                  ,isFirst bit
								  ,CreateDate date NOT NULL)

INSERT @table
-- keyGroup, isHighPriority, isFirst
VALUES (1111,N'АБВ1708280242', 0,N'2009-05-25 00:00:00.000'),     (1111,N'АБВ1708280242',  1,N'2009-05-25 00:00:00.000'),(1111,N'АБВ1808280242',  1,N'2012-05-25 00:00:00.000')
	 , (1111,N'АБВ1708280242',  null,N'2009-05-25 00:00:00.000'), (1111,N'АБВ1708280242', 1,N'2010-05-25 00:00:00.000'),(1111,null,  1,N'2008-05-25 00:00:00.000')

,(2222, N'АБВ1808280242',0,N'2009-05-25 00:00:00.000'), (2222,null, 1,N'2009-05-25 00:00:00.000'), (2222,null, null,N'2009-05-25 00:00:00.000'), (2222,null, 1,N'2010-05-25 00:00:00.000')
,(3333,N'АБВ1708280242',0,N'2009-05-25 00:00:00.000'), (3333,N'АБВ1708280242',1,N'2006-05-25 00:00:00.000'), (3333,N'АБВ1708280242',1,N'2006-05-25 00:00:00.000')

--начальные данные
select * from @table;

--запрос отображающий результат
INSERT @tableResult
select keyGroup, isHighPriority, isFirst,CreateDate from @table where ID = 2 OR  ID = 8 OR  ID = 12 
--результат должен быть как в этом запросе
select * from @tableResult
GO
17 окт 18, 17:02    [21706874]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
aleks222
Member

Откуда:
Сообщений: 985
--Приоритет 1
select top(1) keyGroup, isHighPriority, isFirst,CreateDate 
   from @table 
   where ID = 2 OR  ID = 8 OR  ID = 12 
             and exists( select * from @table where isHighPriority = @HighPriorityID)
   order by iif( isHighPriority = @HighPriorityID, 0, 1) asc
             ,  iif( isFirst > 0, 0, 1 ) asc -- в условиях НЕ описан случай ( isFirst > 0 ) отсутствует
             , CreateDate asc
17 окт 18, 17:17    [21706905]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
aleks222
Member

Откуда:
Сообщений: 985
Пардон, забыл убрать
--Приоритет 1
select top(1) keyGroup, isHighPriority, isFirst,CreateDate 
   from @table 
   where isHighPriority = @HighPriorityID
   order by iif( isFirst > 0, 0, 1 ) asc -- в условиях НЕ описан случай ( isFirst > 0 ) отсутствует
             , CreateDate asc
17 окт 18, 17:21    [21706912]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
UseMuse
Member

Откуда:
Сообщений: 5
в каждой группе по keyGroup нужно определять по :
--Приоритет 1
-- берем  данные, где задано isHighPriority = @HighPriorityID
-- если таких данных  (где задано isHighPriority = @HighPriorityID )больше одного, то берем данные, где   isFirst > 0
-- если таких данных (где  isFirst > 0) больше одного, то берем TOP 1  с самой старой датой CreateDate
--Приоритет 2
--иначе (Нет данных где isHighPriority = @HighPriorityID)
--если имеются записи с isFirst > 0, взять все записи с Max(isFirst)
-- если таких данных больше одного, то берем TOP 1  с самой старой датой CreateDate
--Приоритет 3
--иначе (Нет данных где isFirst > 0)
--берем TOP 1  с самой старой датой CreateDate

--вот ожидаемый результат 

--запрос отображающий результат
INSERT @tableResult
select keyGroup, isHighPriority, isFirst,CreateDate from @table where ID = 2 OR  ID = 8 OR  ID = 12 
результат должен быть как в этом запросе
select * from @tableResult
GO
17 окт 18, 17:32    [21706933]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
UseMuse
Member

Откуда:
Сообщений: 5
В результате мы должны получить все записи групп, где

--Приоритет 1
-- берем данные, где задано isHighPriority = @HighPriorityID
-- если таких данных (где задано isHighPriority = @HighPriorityID )больше одного, то берем данные, где isFirst > 0
-- если таких данных (где isFirst > 0) больше одного, то берем TOP 1 с самой старой датой CreateDate
--Приоритет 2
--иначе (Нет данных где isHighPriority = @HighPriorityID)
--если имеются записи с isFirst > 0, взять все записи с Max(isFirst)
-- если таких данных больше одного, то берем TOP 1 с самой старой датой CreateDate
--Приоритет 3
--иначе (Нет данных где isFirst > 0)
--берем TOP 1 с самой старой датой CreateDate
17 окт 18, 17:34    [21706935]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
aleks222
Member

Откуда:
Сообщений: 985
Дарагой, ну сам то чуток пошевели мозгами, а?
17 окт 18, 19:13    [21707091]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
_human
Member

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

	select top 1 with ties *
	from @table
	order by row_number() over(partition by keyGroup 
		order by 
			 case when isHighPriority = @HighPriorityID then 1 end desc
			,isFirst desc
			,CreateDate asc
			)

?
17 окт 18, 19:15    [21707094]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
PizzaPizza
Member

Откуда:
Сообщений: 370
UseMuse
-- если
-- если
-- если
--иначе
--иначе
--иначе


Все это хозяйство это условия if, case.

Хинт - везде у вас TOP(1), скорее всего это не условие.
17 окт 18, 20:59    [21707166]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
UseMuse
Member

Откуда:
Сообщений: 5
aleks222, пошевелил

with t as
(
 select
  ID, keyGroup, isHighPriority, isFirst, CreateDate,
  row_number() over (partition by keyGroup
    order by
    case when isHighPriority = @isHighPriority then 0 else 1 end,
    isFirst desc,
    CreateDate ASC
  ) as rn
 from
  @table
)
select
 ID, keyGroup, isHighPriority, isFirst, CreateDate
from
 t
where
 rn = 1;
18 окт 18, 10:02    [21707458]     Ответить | Цитировать Сообщить модератору
 Re: Нереально сложный запрос  [new]
UseMuse
Member

Откуда:
Сообщений: 5
_human, результат верный,

мой вариант

with t as
(
 select
  ID, keyGroup, isHighPriority, isFirst, CreateDate,
  row_number() over (partition by keyGroup
    order by
    case when isHighPriority = @isHighPriority then 0 else 1 end,
    isFirst desc,
    CreateDate ASC
  ) as rn
 from
  @table
)
select
 ID, keyGroup, isHighPriority, isFirst, CreateDate
from
 t
where
 rn = 1;
18 окт 18, 10:03    [21707459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить