powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нереально сложный запрос
10 сообщений из 10, страница 1 из 1
Нереально сложный запрос
    #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
Нереально сложный запрос
    #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
Нереально сложный запрос
    #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
Нереально сложный запрос
    #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
Нереально сложный запрос
    #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
Нереально сложный запрос
    #39719066
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дарагой, ну сам то чуток пошевели мозгами, а?
...
Рейтинг: 0 / 0
Нереально сложный запрос
    #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
Нереально сложный запрос
    #39719100
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UseMuse
Код: sql
1.
2.
3.
4.
5.
6.
-- если
-- если
-- если
--иначе
--иначе
--иначе



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

Хинт - везде у вас TOP(1), скорее всего это не условие.
...
Рейтинг: 0 / 0
Нереально сложный запрос
    #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
Нереально сложный запрос
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нереально сложный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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