Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2017, 18:49   #1
Andersen1723
Новичок
Джуниор
 
Регистрация: 03.07.2017
Сообщений: 2
По умолчанию Как обработать ряд дат без использования оконных функций?

Есть ряд дат с различными значениями статуса.

Например:

DT STATUS
01.02.2017 1
05.02.2017 2
07.02.2017 2
21.02.2017 3
24.02.2017 1
25.02.2017 3
28.02.2017 2
03.03.2017 1

Необходимо подсчитать общее количество дней для каждого из статусов.

В результате должно получиться следующее:

Для STATUS=1:
с 01.02.2017 по 04.02.2017: 4 дня
с 24.02.2017 по 24.02.2017: 1 день
с 03.03.2017 по 03.03.2017: 1 день
итого: 6 дней

Для STATUS=2:
с 05.02.2017 по 20.02.2017: 16 дней
с 28.02.2017 по 02.03.2017: 3 дня
итого: 19 дней

Для STATUS=3:
с 21.02.2017 по 23.02.2017: 3 дня
с 25.02.2017 по 27.02.2017: 3 дня
итого: 6 дней

Я вполне себе представляю, как это выполнить с помощью “оконных” функций.

А как это сделать без “оконных” функций?
Andersen1723 вне форума Ответить с цитированием
Старый 04.07.2017, 19:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Без over так, например, сиквел
Код:
SELECT U.dt,CASE WHEN U.dtend IS NULL THEN U.dt ELSE DATEADD (dd,-1,U.dtend) END,
    DATEDIFF(dd,U.dt,CASE WHEN U.dtend IS NULL THEN U.dt ELSE DATEADD (dd,-1,U.dtend) END)+1
  FROM (SELECT T1.dt,(SELECT MIN(T2.dt) FROM MyTable T2 WHERE T2.dt>T1.dt) AS dtend FROM MyTable T1 WHERE T1.status=1) U
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.07.2017, 18:44   #3
Andersen1723
Новичок
Джуниор
 
Регистрация: 03.07.2017
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Без over так, например, сиквел
Код:
SELECT U.dt,CASE WHEN U.dtend IS NULL THEN U.dt ELSE DATEADD (dd,-1,U.dtend) END,
    DATEDIFF(dd,U.dt,CASE WHEN U.dtend IS NULL THEN U.dt ELSE DATEADD (dd,-1,U.dtend) END)+1
  FROM (SELECT T1.dt,(SELECT MIN(T2.dt) FROM MyTable T2 WHERE T2.dt>T1.dt) AS dtend FROM MyTable T1 WHERE T1.status=1) U
Так-то, конечно, благодарю.

Однако это же вроде бы T-SQL.

А нельзя ли исхитриться так, чтобы подошло для любой RDBMS?
Andersen1723 вне форума Ответить с цитированием
Старый 05.07.2017, 23:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Andersen1723 Посмотреть сообщение
А нельзя ли исхитриться так, чтобы подошло для любой RDBMS?
думаю, что нет, нельзя.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод чисел из двоичной системы счисления в десятичную без использования процедур и функций crolikoff Паскаль, Turbo Pascal, PascalABC.NET 22 23.01.2016 21:35
помогите пожалуйста решить задачку без использования функций и подпрограмм masynye Паскаль, Turbo Pascal, PascalABC.NET 4 29.11.2015 16:32
Генератор псевдослучайных чисел без использования встроеных функций lordik333 C# (си шарп) 1 03.12.2012 20:18
Как корректно определить границы кучи в любой момент времени без использования функций менеджера дрп в си DartLenin Общие вопросы C/C++ 0 18.12.2010 21:15
Как отследить нажатие на ссылку, без использования JS [Smarik] PHP 2 04.07.2009 15:27