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

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

16.10.2018, 14:55. Показов 2999. Ответов 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,325
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,325
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,325
17.10.2018, 12:47  [ТС]
ожидаемый результат
Изображения
 
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
17.10.2018, 12:49  [ТС]
вот этот Название: Безымянный.png
Просмотров: 69

Размер: 4.2 Кб,
выше который пример результата, там ошибка с 6 элементом из второй группы, его не должно быть
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
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,325
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,325
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,325
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,325
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,325
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru