powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом..
15 сообщений из 15, страница 1 из 1
Помогите пожалуйста с запросом..
    #39956306
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:
DT EmployeeID TaskID Hours Comment2020-04-20 13:30 233 13567 0.3 Comment12020-04-20 13:31 233 13567 0.2 Comment22020-04-20 13:36 233 13597 3.1 Comment12020-04-20 15:36 233 20371 2.7 2020-04-20 15:39 233 20371 0.3 Comment12342020-04-20 15:47 233 20371 0.3 2020-04-21 15:47 139 20091 1.8 2020-04-21 15:49 139 20091 0.3 Комментарий012020-04-21 13:17 103 20175 0.3 Примечание2020-04-21 17:10 107 20175 0.3 2020-04-21 18:17 107 20176 0.1 Нет данных2020-04-21 13:17 108 20135 2.3 Пример

Мне нужно просуммировать Hours по каждому дню в группе Employee - TaskID . При этом вывести Comment , у той записи в группе, где дата " DT " самая ранняя. Если Comment нет в самой ранней дате, вывести следующий за ним в группе (если он есть)

Т.е. должна получиться табличка:
DT EmployeeID TaskID Hours Comment2020-04-20 13:30 233 13567 0.5 Comment12020-04-20 13:36 233 13597 3.1 Comment12020-04-20 15:36 233 20371 3.3 Comment12342020-04-21 15:49 139 20091 2.1 Комментарий012020-04-21 13:17 103 20175 0.3 Примечание2020-04-21 17:10 107 20175 0.3 2020-04-21 18:17 107 20176 0.1 Нет данных2020-04-21 13:17 108 20135 2.3 Пример

Пишу запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select DT = convert(date, DT)
      ,EmployeeID
      ,TaskID
      ,sum(Hours)
 from Table1
group by convert(date, DT)
        ,EmployeeID
        ,TaskID 


но теперь нужно прилепить ещё и нужный комментарий.
Что то уже голову сломал..
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956320
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT DISTINCT * FROM 
(
SELECT  
Employee, TaskID, CAST(DT AS DATE),
SUM(Hours) OVER (PARTITION BY Employee, TaskID, CAST(DT AS DATE)),
FIRST_VALUE(Comment) OVER (PARTITION BY Employee, TaskID, CAST(DT AS DATE) ORDER BY DT)
FROM Table1 
) T
 
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956326
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Да! FIRST_VALUE - то что нужно. Думаю, в самый раз.
Благодарю.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956334
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
Да! FIRST_VALUE - то что нужно.
Неужели? И как оно согласуется с
MAULER
При этом вывести Comment , у той записи в группе, где дата " DT " самая ранняя. Если Comment нет в самой ранней дате, вывести следующий за ним в группе (если он есть)
?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as
(
 select
  t.DT, t.EmployeeID, t.TaskID, t.Comment,
  row_number() over (partition by t.EmployeeID, t.TaskID order by a.f, t.DT) as rn,
  sum(Hours) over (partition by t.EmployeeID, t.TaskID) as s
 from
  Таблица t cross apply
  (select case when t.Comment > '' then 1 else 2 end) a(f)
)
select EmployeeID, TaskID, Comment, s from t where rn = 1;
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956353
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Неужели?

А если у меня вместо пустых значений в столбце Comment будет NULL - тоже не подойдет?
И ещё в Вашем примере в with секции сумма два раза считаться будет?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956364
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
А если у меня вместо пустых значений в столбце Comment будет NULL - тоже не подойдет?
first_value не игнорирует NULL
MAULER
И ещё в Вашем примере в with секции сумма два раза считаться будет?
С чего вдруг?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956418
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as
(
 select t.DT,
        t.EmployeeID,
        t.TaskID,
        t.Comment,
        row_number() over (partition by t.EmployeeID, t.TaskID order by a.f, t.DT) as rn,
        sum(Hours) over (partition by t.EmployeeID, t.TaskID) as s
   from Таблица t
  cross apply (select case when t.Comment > '' then 1 else 2 end) a(f)
)
select EmployeeID, TaskID, Comment, s from t where rn = 1;



в окно с row_number() наверно нужно добавить
Код: sql
1.
CAST(t.DT as data)

вот так:
Код: sql
1.
row_number() over (partition by CAST(t.DT as data), t.EmployeeID, t.TaskID order by t.DT, a.f) as rn,


иначе мы поимеем сумму по каждому работнику за весь период.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956432
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
в окно с row_number() наверно нужно добавить
Видимо. И к sum() over тоже.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956752
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
Вот что то смотрю на запрос и не могу понять:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select t.DT,
        t.EmployeeID,
        t.TaskID,
        t.Comment,
        row_number() over (partition by t.EmployeeID, t.TaskID order by a.f, t.DT) as rn,
        sum(Hours) over (partition by t.EmployeeID, t.TaskID) as s
   from Таблица t


вот этот фрагмент будет считать сумму для каждой не группированной строки таблицы в виде расчетного поля "s",
а потом просто возмет первую строку окна (где суммы везде одинаковы), где a.f = 1?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956762
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
вот этот фрагмент будет считать сумму для каждой не группированной строки таблицы в виде расчетного поля "s",
а потом просто возмет первую строку окна (где суммы везде одинаковы), где a.f = 1?
Да.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956783
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Это будет очень долго ((
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956787
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
Это будет очень долго ((
Предполагаете? Или уже сравнили различные варианты?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956806
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
Я могу ошибаться, но мне кажется, что sum() c group by работают быстрее чем Ваш вариант.

Скажите, а если не искать в окне первый не нулевой каммент, а склеить все каменты окна и вывести рядышком с суммой?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39956838
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER, гадать можно долго. А проверять вы не хотите.

Если хотите быстро, то нужно

1. Добавить в таблицу вычисляемый столбец
Код: sql
1.
alter table Table1 add D as cast(DT as date);


2. Сделать индексированное представление
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create view View1
with schemabinding
as
select
 D, EmployeeID, TaskID,
 count_big(*) as c,
 sum(Hours) as Hours_sum
from
 Table1
group by
 D, EmployeeID, TaskID;
go

create unique clustered index UCIX_View1 on View1 (D, EmployeeID, TaskID);
go


3. Сделать индекс
Код: sql
1.
create index IX_Table1 on Table1 (D, EmployeeID, TaskID, DT) include (Comment);


4. Переписать запрос так
Код: sql
1.
2.
3.
4.
5.
select
 t.D, t.EmployeeID, t.TaskID, t.Hours_sum, c.Comment
from
 View1 t with (noexpand) outer apply
 (select top (1) Comment from Table1 where D = t.D and EmployeeID = t.EmployeeID and TaskID = t.TaskID and Comment > '' order by DT) c;
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом..
    #39957216
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом..
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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