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

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

16.10.2018, 14:55. Показов 3034. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru