Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324

Сложный запрос

16.10.2018, 14:55. Показов 2985. Ответов 15

Студворк — интернет-сервис помощи студентам
Сгруппировать по keyGroup. Если в группе больше одной записи
Если в группе есть хоть одна запись у которой isFirst = 1, получить все записи только у которых isFirst = 1
Иначе в группе нет записей, у которых isFirst = 1, получить все записи.
Иначе в группе одна запись, получить эту запись

В результате мы должны получить все записи групп, где :
если в группе имеются записи с isFirst = 1 - они в приоритете, это значит,
что записи этой же группы с 0 брать не нужно, берем только с 1.

если в группе нет записей с isFirst = 1, то берем все записи группы.


T-SQL
1
2
3
4
5
6
DECLARE @table TABLE (ID int PRIMARY KEY NOT NULL IDENTITY(1, 1)
                                  ,keyGroup  int  
                                  ,isFirst bit)
 
INSERT @table
VALUES (1, 0), (1, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1), (4, 0), (5, 0);
Ожидаемый результат
ID keyGroup isFirst
2 1 1
4 1 1
6 2 1
7 3 1
8 4 0
9 5 0
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2018, 14:55
Ответы с готовыми решениями:

Сложный запрос к БД
Есть БД, в ней таблица main с полями ip(адрес абонента),datetime(время запроса),size(размер ответа в байтах). Внимание!!!! Необходимо...

Сложный запрос
Всем привет! (пример) Есть 3 таблицы:Users, Auto, Motorcycles. (Они связаны через ключевое поле userID.) Мне нужно вывести...

сложный запрос
Есть таблица А: id | date | number, id - int date - datetime number - int, 0, 1 или 2 Необходим запрос в табл А, где...

15
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
16.10.2018, 15:01  [ТС]
Название: Снимок.PNG
Просмотров: 89

Размер: 2.8 Кб
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
16.10.2018, 15:59
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with t as
(
 select
  *,
  count(*) over (partition by keyGroup) as c,
  sum(cast(isFirst as int)) over (partition by keyGroup) as c1
 from
  @table
)
select
 id, keyGroup, isFirst
from
 t
where
 c = 1 or
 c1 = 0 or
 (c1 > 0 and isFirst = 1);
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 12:29  [ТС]
invm, помоги пожалуйста
isFirst может быть null, если null то isFirst принимаем за 0
добавилось еще одно поле isHighPriority, null принимаем за ISNULL(isHighPriority ,N''), которые по приоритету выше isFirst


Приоритет 1
если есть данные где задано isHighPriority, взять все записи с Max(isHighPriority)
Приоритет 2
иначе
если имеются записи с isFirst > 0, взять все записи с Max(isFirst)
Приоритет 3
иначе
берем записи где isFirst = 0


T-SQL
1
2
3
4
5
6
7
8
9
10
11
DECLARE @table TABLE (ID int PRIMARY KEY NOT NULL IDENTITY(1, 1)
                                  ,keyGroup  int  
,isHighPriority nvarchar(13) NULL  -- АБВ1808280242
                                  ,isFirst bit NULL)
 
INSERT @table
VALUES (1,N'АБВ1809280242', 0), (1,NULL,  1), (1,N'АБВ1708280242',  null), (1,N'АБВ1809280242', 1)
,(2, N'АБВ1808280242',0), (2,null, 1)
,(3, null,0), (3, null,1)
,(4, N'АБВ1808280242',0)
,(5, null,null)
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 12:47  [ТС]
ожидаемый результат
Изображения
 
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 12:49  [ТС]
вот этот Название: Безымянный.png
Просмотров: 69

Размер: 4.2 Кб,
выше который пример результата, там ошибка с 6 элементом из второй группы, его не должно быть
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 12:51  [ТС]
и поле DocIDReserved это поле уже по другому называется isHighPriority
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.10.2018, 12:51
Как-то так
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with t as
(
 select
  ID, keyGroup, isHighPriority, isFirst,
  max(isHighPriority) over (partition by keyGroup) as mhp,
  max(cast(isFirst as tinyint)) over (partition by keyGroup) mf
 from
  @table
)
select
 *--ID, keyGroup, isHighPriority, isFirst
from
 t
where
 isHighPriority = mhp or
 (mhp is null and isFirst = mf);
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 12:55  [ТС]
invm,
T-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
DECLARE @table TABLE (ID int PRIMARY KEY NOT NULL IDENTITY(1, 1)
                                  ,keyGroup  int
                                  ,isHighPriority nvarchar(13)  NULL 
                                  ,isFirst bit)
 
INSERT @table
VALUES (1,N'АБВ1808280242', 0), (1,NULL,  1), (1,N'АБВ1708280242',  null), (1,N'АБВ1808280242', 1)
,(2, N'АБВ1808280242',0), (2,null, 1)
,(3, null,0), (3, null,1)
,(4, N'АБВ1808280242',0)
,(5, null,null);
 
with t as
(
 select
  ID, keyGroup, isHighPriority, isFirst,
  max(isHighPriority) over (partition by keyGroup) as mhp,
  max(cast(isFirst as tinyint)) over (partition by keyGroup) mf
 from
  @table
)
select
 *--ID, keyGroup, isHighPriority, isFirst
from
 t
where
 isHighPriority = mhp or
 (mhp is null and isFirst = mf);
Добавлено через 2 минуты
invm,
элемент с ID 10 группа 5 не попал в выборку
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.10.2018, 12:59
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with t as
(
 select
  ID, keyGroup, isHighPriority, isFirst,
  max(isHighPriority) over (partition by keyGroup) as mhp,
  max(cast(isnull(isFirst, 0) as tinyint)) over (partition by keyGroup) mf
 from
  @table
)
select
 ID, keyGroup, isHighPriority, isFirst
from
 t
where
 isHighPriority = mhp or
 (mhp is null and isnull(isFirst, 0) = mf);
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 17:59  [ТС]
invm, какая-та жесть нереальная....нужна помощь! Не давно начал изучать T SQL, самостоятельно не осилю


T-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
46
47
--Нужно получить записи из каждой группы (по 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
 
--Результат записать в @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,CreateDate
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
--ID =2 OR  ID = 8 OR  ID = 12 - эти ID должны вычислятся в запросе, тут я их тупо сам вычислил на основании приоритетов и подставил
select keyGroup, isHighPriority, isFirst,CreateDate from @table where ID = 2 OR  ID = 8 OR  ID = 12 
--конечный ожидаемый результат должен быть как в этом запросе
select * from @tableResult
GO
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
17.10.2018, 18:01  [ТС]
ожидаемый результат
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.10.2018, 19:03
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

T-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 desc
  ) as rn
 from
  @table
)
select
 ID, keyGroup, isHighPriority, isFirst, CreateDate
from
 t
where
 rn = 1;
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
18.10.2018, 10:04  [ТС]
invm,
еще вариант с решением этой задачи, результат такой же, кода по меньше вышло

T-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
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.10.2018, 10:27
Цитата Сообщение от UseMuse Посмотреть сообщение
кода по меньше вышло
Меньше кода не всегда хорошо.
Если данных много, то мой вариант предпочтительнее по производительности.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,324
19.10.2018, 16:05  [ТС]
del
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2018, 16:05
Помогаю со студенческими работами здесь

Сложный запрос
Здравствуйте!у меня есть БД: Успеваемость(#Nз, #ИдКурса, #Семестр, #УчНед, #ВидОтчета, Оценка) ОтчетГруппы(#ИдКурса, #Nгр, #УчНед,...

Сложный запрос
Всем доброго времени суток. Всех милых дам с 8 марта!:rose: И так у меня БД: Реляционная модель: Нужно получить...

Сложный запрос
Доброго времени суток! Знатоки SQL подскажите пожалуйста как привести в рабочий вид мой запрос: DECLARE @data AS XML, ...

Составить сложный запрос
Срочно нужно составить сложный запрос В таблице RPM_ZONE_FUTURE_RETAIL хранятся изменения цен на уровне товар/ценовая зона...

Сложный мега запрос
Помогите пожалуйста, мне нужно стделать так как написано в третем задании и нужно чтоб дата и склад задавались как в 1 и 2 примере.:O_O: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru