Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нереально сложный запрос / 10 сообщений из 10, страница 1 из 1
17.10.2018, 17:02
    #39718988
UseMuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
Помогите решить задачку, неделю только изучаю T SQL, вторые сутки решить уже не могу!
Эт прст жесть )

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
--Приоритет 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
...
Рейтинг: 0 / 0
17.10.2018, 17:17
    #39719000
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
--Приоритет 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
...
Рейтинг: 0 / 0
17.10.2018, 17:21
    #39719001
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
Пардон, забыл убрать
Код: sql
1.
2.
3.
4.
5.
6.
--Приоритет 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
...
Рейтинг: 0 / 0
17.10.2018, 17:32
    #39719007
UseMuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
в каждой группе по keyGroup нужно определять по :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
--Приоритет 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
...
Рейтинг: 0 / 0
17.10.2018, 17:34
    #39719008
UseMuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
В результате мы должны получить все записи групп, где

--Приоритет 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
...
Рейтинг: 0 / 0
17.10.2018, 19:13
    #39719066
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
Дарагой, ну сам то чуток пошевели мозгами, а?
...
Рейтинг: 0 / 0
17.10.2018, 19:15
    #39719068
_human
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
UseMuse,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	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
			)


?
...
Рейтинг: 0 / 0
17.10.2018, 20:59
    #39719100
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
UseMuse
Код: sql
1.
2.
3.
4.
5.
6.
-- если
-- если
-- если
--иначе
--иначе
--иначе



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

Хинт - везде у вас TOP(1), скорее всего это не условие.
...
Рейтинг: 0 / 0
18.10.2018, 10:02
    #39719221
UseMuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
aleks222, пошевелил

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;
...
Рейтинг: 0 / 0
18.10.2018, 10:03
    #39719222
UseMuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нереально сложный запрос
_human, результат верный,

мой вариант

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нереально сложный запрос / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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