Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Добрый день, уважаемые форумчане!
Помогите новичку!
Есть таблица учета времени работы бригады, в которой каждый вид работ учитывается отдельной строкой

-- creating table
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDate date NOT NULL,
FromTime time NOT NULL,
ToDate date NOT NULL,
ToTime time NOT NULL
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDate,FromTime,ToDate,ToTime)
VALUES
('Покраска стен','2017-09-10','20:00','2017-09-11','06:00'),
('Установка дверей','2017-09-10','18:00','2017-09-10','22:00'),
('Поклейка обоев','2017-09-11','04:00','2017-09-11','9:00'),
('Установка окон','2017-09-12','14:00','2017-09-12','20:00'),
('Покраска полов','2017-09-12','16:00','2017-09-13','04:00')


Нужно посчитать общее кол-во часов, отработанное бригадой (то есть в данном примере результатом выборки должно стать кол-во часов 31, см вложение для нагладности)
Подскажите плиз, в какую сторону копать?
Заранее благодарен!
25 янв 18, 02:19    [21136506]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Вложение не вложилось)

К сообщению приложен файл. Размер - 47Kb
25 янв 18, 02:20    [21136509]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Гордон Шамуэй,

найти разность каждого этупа работ, после чего - посчитать сумму разностей.
читать про sum + group by
и про арифметику дат...
25 янв 18, 05:31    [21136543]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Добрый Э - Эх,

Интервалы пересекаются, так что простая арифметика не прокатит.
По теме подойдёт: Добавить недостающие периоды.
25 янв 18, 05:49    [21136546]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Kopelly,

опять всё усложняешь..... зачем раскладывать диапазоны в точки, точки собирать в диапазоны, если можно сразу собрать в один покрывающий диапазон кучу пересекающихся?
25 янв 18, 06:09    [21136550]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Гордон Шамуэй,

ты бы ещё версию сервера огласил, чтобы понимать какие решения у тебя будут работать....
25 янв 18, 06:14    [21136552]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Гордон Шамуэй,

ладно, будем считать,что у тебя 2012 и выше....

для упрощения демонстрации ВОЗМОЖНОГО варианта решения я внес небольшие изменения в структуру исходной таблицы. Раздельные поля DATE и TIME объединил в целостный DateTime. Но это можно было бы сделать и на уровне запроса, соответствующими преобразованиями, и далее к преобразованным данным применить предложенный запрос...

-- creating table
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDateTime datetime NOT NULL,
ToDateTime datetime NOT NULL
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDateTime,ToDateTime)
VALUES
(   'Покраска стен', '2017-09-10 20:00:00', '2017-09-11 06:00:00'),
('Установка дверей', '2017-09-10 18:00:00', '2017-09-10 22:00:00'),
(  'Поклейка обоев', '2017-09-11 04:00:00', '2017-09-11 09:00:00'),
(  'Установка окон', '2017-09-12 14:00:00', '2017-09-12 20:00:00'),
(  'Покраска полов', '2017-09-12 16:00:00', '2017-09-13 04:00:00')

--
-- Основной запрос:
select distinct sum(DATEDIFF(hour, min(FromDateTime), dateadd(hh,1,max(ToDateTime)))) over() as x_value
  from (
         select  FromDateTime, ToDateTime, sum(sog) over(order by FromDateTime,ToDateTime) as grp_id
           from (
                  select FromDateTime, ToDateTime,
                         case 
                           when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 
                    from uchet_vremeni t
                ) v0
       ) v1
 group by grp_id

--
-- Результат запроса:

x_value
-------
     31
On-line проверка на сайте sqlfiddle.com
25 янв 18, 07:23    [21136583]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Гордон Шамуэй,

ладно, будем считать,что у тебя 2012 и выше....

для упрощения демонстрации ВОЗМОЖНОГО варианта решения я внес небольшие изменения в структуру исходной таблицы.
Раздельные поля DATE и TIME объединил в целостный DateTime.
Но это можно было бы сделать и на уровне запроса, соответствующими преобразованиями, и далее к преобразованным данным применить предложенный запрос...


-- creating table
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDateTime datetime NOT NULL, -- Внесенные изменения в структуру таблицы
ToDateTime datetime NOT NULL -- Внесенные изменения в структуру таблицы
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDateTime,ToDateTime)
VALUES
(   'Покраска стен', '2017-09-10 20:00:00', '2017-09-11 06:00:00'),
('Установка дверей', '2017-09-10 18:00:00', '2017-09-10 22:00:00'),
(  'Поклейка обоев', '2017-09-11 04:00:00', '2017-09-11 09:00:00'),
(  'Установка окон', '2017-09-12 14:00:00', '2017-09-12 20:00:00'),
(  'Покраска полов', '2017-09-12 16:00:00', '2017-09-13 04:00:00')

--
-- Основной запрос:
select distinct sum(DATEDIFF(hour, min(FromDateTime), dateadd(hh,1,max(ToDateTime)))) over() as x_value
  from (
         select  FromDateTime, ToDateTime, sum(sog) over(order by FromDateTime,ToDateTime) as grp_id
           from (
                  select FromDateTime, ToDateTime,
                         case 
                           when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 
                    from uchet_vremeni t
                ) v0
       ) v1
 group by grp_id

--
-- Результат запроса:

x_value
-------
     31
On-line проверка на сайте sqlfiddle.com
Чтобы было понятнее, о чем я.... :)
25 янв 18, 07:29    [21136589]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
На 2008 не могу придумать, как сделать короче...
+ Просьба убрать от экранов детей, кошек, беременных и кормящих женщин, и других эмоционально нестабильных личностей
IF OBJECT_ID( 'tempdb..#worksheet' ) IS NOT NULL
  DROP TABLE #worksheet
;
CREATE TABLE
  #worksheet (
    [Team] VARCHAR(20) NOT NULL,
    [Job] VARCHAR(50) NOT NULL,
    [FromDateTime] DATETIME2(0) NOT NULL,
    [TillDateTime] DATETIME2(0) NOT NULL,
    PRIMARY KEY ( [Team], [Job], [FromDateTime] ) )
;
-- inserting test data
INSERT INTO
  #worksheet (
    [Team],
    [Job],
    [FromDateTime],
    [TillDateTime] )
VALUES
  ( 'Бригада1', 'Покраска стен',    '2017-09-10 20:00:00', '2017-09-11 06:00:00' ),
  ( 'Бригада1', 'Установка дверей', '2017-09-10 18:00:00', '2017-09-10 22:00:00' ),
  ( 'Бригада1', 'Поклейка обоев',   '2017-09-11 04:00:00', '2017-09-11 09:00:00' ),
  ( 'Бригада1', 'Установка окон',   '2017-09-12 14:00:00', '2017-09-12 20:00:00' ),
  ( 'Бригада1', 'Покраска полов',   '2017-09-12 16:00:00', '2017-09-13 04:00:00' )
;
IF OBJECT_ID( 'tempdb..#worksheet_plain' ) IS NOT NULL
  DROP TABLE #worksheet_plain
;
SELECT 
  [Team], 
  [Date] = [FromDateTime],
  [Direction] = 1
INTO
  #worksheet_plain
FROM
  #worksheet
UNION ALL
SELECT 
  [Team], 
  [Date] = [TillDateTime],
  [Direction] = -1
FROM
  #worksheet
;
WITH
t0 AS (
  SELECT
    ws.[Team],
    ws.[Date],
    [IsEnd] = CASE WHEN ws.[Direction] + ISNULL( SUM( wsp.[Direction] ), 0 ) = 0 THEN 1 ELSE 0 END
  FROM
    #worksheet_plain ws
    LEFT JOIN #worksheet_plain wsp ON (
          wsp.[Team] = ws.[Team]
      AND wsp.[Date] < ws.[Date] )
  GROUP BY
    ws.[Team],
    ws.[Date],
    ws.[Direction]
),
t1 AS (
  SELECT
    [Team],
    [Date],
    [IsEnd],
    [gn] = ROW_NUMBER() OVER ( PARTITION BY [Team] ORDER BY [Date] )
         - ROW_NUMBER() OVER ( PARTITION BY [Team], [IsEnd] ORDER BY [Date] )
  FROM
    t0
),
t2 AS (
  SELECT
    [Team],
    [Date] = MIN( [Date] ),
    [IsEnd]
  FROM
    t1
  GROUP BY
    [Team],
    [IsEnd],
    [gn]
)
SELECT
  te.[Team],
  [FromDateTime] = MAX( ts.[Date] ),
  [TillDateTime] = te.[Date]
FROM
  t2 te
  INNER JOIN t2 ts ON (
        ts.[Team] = te.[Team]
    AND ts.[Date] < te.[Date] )
WHERE
  te.[IsEnd] = 1
GROUP BY
  te.[Team],
  te.[Date]
ORDER BY
  1, 2
25 янв 18, 11:11    [21137253]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Фикс
+ Презерватив на свечку
SELECT
  te.[Team],
  [FromDateTime] = MAX( ts.[Date] ),
  [TillDateTime] = te.[Date]
FROM
  t2 te
  INNER JOIN t2 ts ON (
        ts.[Team] = te.[Team]
     AND ts.[Date] < te.[Date]
     AND ts.[IsEnd] = 0 )
WHERE
  te.[IsEnd] = 1
GROUP BY
  te.[Team],
  te.[Date]
ORDER BY
  1, 2
25 янв 18, 11:18    [21137294]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Руслан Дамирович
На 2008 не могу придумать, как сделать короче...


-- creating table
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDateTime datetime NOT NULL, -- Внесенные изменения в структуру таблицы
ToDateTime datetime NOT NULL -- Внесенные изменения в структуру таблицы
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDateTime,ToDateTime)
VALUES
(   'Покраска стен', '2017-09-10 20:00:00', '2017-09-11 06:00:00'),
('Установка дверей', '2017-09-10 18:00:00', '2017-09-10 22:00:00'),
(  'Поклейка обоев', '2017-09-11 04:00:00', '2017-09-11 09:00:00'),
(  'Установка окон', '2017-09-12 14:00:00', '2017-09-12 20:00:00'),
(  'Покраска полов', '2017-09-12 16:00:00', '2017-09-13 04:00:00')

--
-- Основной запрос:
with
  b$m_t as
    (
      select distinct v.p, row_number() over(order by p) as rn
        from uchet_vremeni t
       cross apply(values (fromdatetime), (dateadd(hh,1,Todatetime))) v(p)
    )
-- 
select sum(datediff(hh, t1.p, t2.p)) as x_value
  from b$m_t t1
  join b$m_t t2
    on t1.rn = t2.rn - 1
 where exists
        (
          select null from uchet_vremeni t0
           where t2.p > t0.fromdatetime
             and t0.Todatetime > t1.p
        )

--
-- Результат запроса:

x_value
-------
     31
On-line проверка на сайте sqlfiddle.com

Но возможно - магия данных. Нужно проверять на рассширенном составе тестовых данных....
25 янв 18, 11:53    [21137551]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Руслан Дамирович
На 2008 не могу придумать, как сделать короче...


-- creating table
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDateTime datetime NOT NULL, -- Внесенные изменения в структуру таблицы
ToDateTime datetime NOT NULL -- Внесенные изменения в структуру таблицы
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDateTime,ToDateTime)
VALUES
(   'Покраска стен', '2017-09-10 20:00:00', '2017-09-11 06:00:00'),
('Установка дверей', '2017-09-10 18:00:00', '2017-09-10 22:00:00'),
(  'Поклейка обоев', '2017-09-11 04:00:00', '2017-09-11 09:00:00'),
(  'Установка окон', '2017-09-12 14:00:00', '2017-09-12 20:00:00'),
(  'Покраска полов', '2017-09-12 16:00:00', '2017-09-13 04:00:00')

--
-- Основной запрос:
with
  b$m_t as
    (
      select distinct v.p, DENSE_RANK() over(order by p) as rn
        from uchet_vremeni t
       cross apply(values (fromdatetime), (dateadd(hh,1,Todatetime))) v(p)
    )
-- 
select sum(datediff(hh, t1.p, t2.p)) as x_value
  from b$m_t t1
  join b$m_t t2
    on t1.rn = t2.rn - 1
 where exists
        (
          select null from uchet_vremeni t0
           where t2.p > t0.fromdatetime
             and t0.Todatetime > t1.p
        )

--
-- Результат запроса:

x_value
-------
     31
On-line проверка на сайте sqlfiddle.com

Но возможно - магия данных. Нужно проверять на рассширенном составе тестовых данных....

row_number заменить на dense_rank, конечно же....
25 янв 18, 12:00    [21137629]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Добрый Э - Эх,
При часовом интервале (датавремя начала = датавремя окончания) без пересечений с другими интервалами час работы пропадает:

drop TABLE uchet_vremeni
CREATE TABLE uchet_vremeni
(
Id int IDENTITY NOT NULL PRIMARY KEY,
[Job] nvarchar(50) NOT NULL,
FromDateTime datetime NOT NULL, -- Внесенные изменения в структуру таблицы
ToDateTime datetime NOT NULL -- Внесенные изменения в структуру таблицы
)
-- inserting test data
INSERT INTO uchet_vremeni
([Job],FromDateTime,ToDateTime)
VALUES
[color=yellow]('Установка дверей', '2017-09-10 18:00:00', '2017-09-10 18:00:00'), -- Часовая работа[/color]
(   'Покраска стен', '2017-09-10 19:00:00', '2017-09-11 06:00:00'), --Продолжение без перерыва
(  'Поклейка обоев', '2017-09-11 04:00:00', '2017-09-11 09:00:00'), --Далее по тексту
(  'Установка окон', '2017-09-12 14:00:00', '2017-09-12 20:00:00'),
(  'Покраска полов', '2017-09-12 16:00:00', '2017-09-13 04:00:00');

--
-- Основной запрос:
with
  b$m_t as
    (
      select distinct v.p, DENSE_RANK() over(order by p) as rn
        from uchet_vremeni t
       cross apply(values (fromdatetime),  (dateadd(hh,1,Todatetime))) v(p)
    )
select sum(datediff(hh, t1.p, t2.p)) as x_value
  from b$m_t t1
  join b$m_t t2
    on t1.rn = t2.rn - 1
 where exists
        (
          select null from uchet_vremeni t0
           where t2.p > t0.fromdatetime
[color=yellow]             and dateadd(ms,-3,dateadd(hh,1,t0.Todatetime)) >  t1.p --Изменил условие[/color]
--[s]and t0.Todatetime >  t1.p[/s] - старое условие
        )
25 янв 18, 13:15    [21138065]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Kopelly
При часовом интервале (датавремя начала = датавремя окончания) без пересечений с другими интервалами час работы пропадает

- Видишь час работы?
- Не-е-ет.
- И я нет. А он есть!
25 янв 18, 18:14    [21139504]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Добрый Э - Эх,

Спасибо огромное вам и остальным участникам!
Да, у меня 2012

Не до конца понимаю как оно работает, даже глядя на готовый код(

dateadd(hh,1,max(ToDateTime)))) over()
- что означает вот это прибавление одного часа например?

и вот это тоже:
case 
                 when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 
26 янв 18, 01:17    [21140103]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Добрый Э - Эх,

Чтобы не вносить изменения в структуру таблицы, сделал это в виде представления:

WITH Temp AS
(SELECT JOB, CAST (FromDate AS datetime)+CAST (FromTime AS datetime) AS [Begin], CAST (ToDate AS datetime)+CAST (ToTime AS datetime) AS [End]   FROM uchet_vremeni )
SELECT * FROM TEMP
26 янв 18, 01:21    [21140104]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Добрый Э - Эх,

Если я правильно понял, нужно погрузиться в изучение оконных функций.
Пока что это для меня темный лес(
26 янв 18, 01:31    [21140108]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Гордон Шамуэй
Не до конца понимаю как оно работает, даже глядя на готовый код(

dateadd(hh,1,max(ToDateTime)))) over()
- что означает вот это прибавление одного часа например?

Исходя из твоего второго поста: час окончания работы засчитывается полностью - то есть работа с 9-00 до 10-00 - это два часа работы. А работа с 9-00 до 9-00 - один час работы.

Гордон Шамуэй
и вот это тоже:
case 
                 when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 

Если одна из предыдущих работ окончилась после начала текущей, то ставим 0, иначе 1.
Это позволяет проставить 1 для тех работ которые не имеют пересечения с более ранними работами.

Потом просуммировав этот флаг по предыдущим работам:
sum(sog) over(order by FromDateTime,ToDateTime) as grp_id

получим группы интервалов которые пересекаются внутри группы, но пересекаются с другими группами. Взяв максимум и минимум по таким группам получим начала и конец непрерывной работы.
26 янв 18, 04:28    [21140159]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Гордон Шамуэй
Добрый Э - Эх,

Если я правильно понял, нужно погрузиться в изучение оконных функций.
Пока что это для меня темный лес(

Можно и без них, но с ними может быть удобнее писать и значительнее быстрее выполняться.
26 янв 18, 04:33    [21140160]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Ошибочка:
Kopelly
получим группы интервалов которые пересекаются внутри группы, но не пересекаются с другими группами. Взяв максимум и минимум по таким группам получим начала и конец непрерывной работы.
26 янв 18, 04:34    [21140161]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Kopelly
Гордон Шамуэй
Не до конца понимаю как оно работает, даже глядя на готовый код(

dateadd(hh,1,max(ToDateTime)))) over()
- что означает вот это прибавление одного часа например?

Исходя из твоего второго поста: час окончания работы засчитывается полностью - то есть работа с 9-00 до 10-00 - это два часа работы. А работа с 9-00 до 9-00 - один час работы.
Совершенно верно. У автора каждое значение, по сути - это интервал времени длиной в час. MS SQL server же каждое значение воспринимает как точку. Соответственно, для правильного перевода арифметики дат MS SQL Server-а в арифметику дат топикстартера нужно прибавлять к дате завершения один час. Как вариант, можно было брать datediff между исходными значениями и к результату его работы добавлять единицу:
-- вполне можно заменить конструкцию:
sum(DATEDIFF(hour, min(FromDateTime), dateadd(hh,1,max(ToDateTime)))) -- выделенный красной областью текст - выкинуть
-- на такое:
sum(DATEDIFF(hour, min(FromDateTime), max(ToDateTime)) + 1) -- не забыть добавить единицу к разности дат...



Гордон Шамуэй
и вот это тоже:
case 
                 when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 
Этот кусок года помечает все начала непересекающихся групп... Если вспомнить классическое решение Ицика Бен-Гана задачи группировки отрезков, то этот фрагмент кода по логике своей работы эквивалентен поиску всех начал (представление vw_dt_start в статье из ссылки)...
26 янв 18, 05:54    [21140178]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Добрый Э - Эх
Guest
Гордон Шамуэй
Добрый Э - Эх,

Если я правильно понял, нужно погрузиться в изучение оконных функций.
Пока что это для меня темный лес(
Возможно, прочтение этой книжки позволит научиться ориентироваться в этом лесу....
26 янв 18, 06:04    [21140179]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Kopelly,
Большое спасибо!
Буду разбираться.
26 янв 18, 18:39    [21142586]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Добрый Э - Эх,

Уже посмотрел пару видеоуроков по теме.
За книжку спасибо, обязательно найду!
26 янв 18, 18:40    [21142590]     Ответить | Цитировать Сообщить модератору
 Re: Кол-во часов, отработанное бригадой за период  [new]
Гордон Шамуэй
Member

Откуда:
Сообщений: 34
Kopelly,

автор
Исходя из твоего второго поста: час окончания работы засчитывается полностью - то есть работа с 9-00 до 10-00 - это два часа работы. А работа с 9-00 до 9-00 - один час работы.


Ребята, понял свою исходную ошибку.
Конечно же, интервал, например, от 18 до 22 часов - это 4 часа, а не 5.
То есть в итоге должно получиться 29 часов, а не 31.
Исходя из этого, вот этот кусок года нужно исключить
dateadd(hh,0,


И остается вот так?

select distinct sum(DATEDIFF(hour, min(FromDateTime), max(ToDateTime))) over() as x_value
  from (
         select  FromDateTime, ToDateTime, sum(sog) over(order by FromDateTime,ToDateTime) as grp_id
           from (
                  select FromDateTime, ToDateTime,
                         case 
                           when max(ToDateTime) 
                               over(order by FromDateTime, ToDateTime 
                                        rows between unbounded preceding
                                                         and 1 preceding
                                   ) >= FromDateTime
                           then 0 
                           else 1 
                         end as sog 
                    from brigada t
                ) v0
       ) v1
 group by grp_id


Тогда запрос выдает результат 29
27 янв 18, 01:35    [21143231]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить