Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429

Оконные функции для интервалов дат

09.12.2020, 13:21. Показов 7504. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Имеется таблица по развозу товара разными авто (MS SQL 2012):
CAR SHOP DATE
Logan Хлеб 2020-06-28 12:50:02.000
Largus Барсик 2020-06-24 07:10:02.000
Kuga Хозтовары 2020-06-24 04:55:12.000
ГАЗ Квас 2020-06-24 12:40:12.000
Logan Барсик 2020-06-24 23:00:13.000
Largus Ц.Рынок 2020-06-24 01:40:32.000
Таврия Хлеб 2020-06-24 00:00:34.000
Kuga Квас 2020-06-24 05:00:34.000
Logan Барсик 2020-06-25 00:37:35.000
Таврия Ц.Рынок 2020-06-24 09:00:52.000
ГАЗ Ц.Рынок 2020-06-24 00:00:56.000
Largus Хлеб 2020-06-24 00:01:00.000
Logan Барсик 2020-06-23 12:01:03.000
Для некоторой машины за промежуток времени для каждого дня из промежутка нужно получить результат типа:
2020-06-24
с 0ч до 1ч. заезжал в Квас 5 раз, 2 раза в Хлеб, с 4-5 4 раза на рынок, 4 раза в хоз товары, с 12-13 никуда не заезжал и так для каждого часа из суток
Наверняка задача решается с помощью оконных функций, но не могу сообразить, как разбить сначала на партиции по дата в пределах суток, а потом и по времени в пределах часа. Задача жизненная, может кто нибудь сталкивался.

Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2020, 13:21
Ответы с готовыми решениями:

Создание запроса в MS Access для вывода интервала дат с учетом пересечения этих интервалов
Доброго времени суток дамы и господа как то на этом форуме мне очень помогли с задачей похожего характера, в течении сегодняшнего дня...

Пересечение интервалов дат в Excel. Вывод дат пересечения интервалов
Добрый день. Помогите пожалуйста. Мне надо найти совпадения в периодах работы одного и того же человека на разных предприятиях. Если он...

Оконные функции
Приветствую, форумчане. Столкнулся с необходимостью высчитать агрегатное значение от агрегатной функции (максимум от сумм частного, т.е...

8
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
09.12.2020, 14:07
Лучший ответ Сообщение было отмечено Landser как решение

Решение

Оконные функции тут ни при чем.
Группировка по CAR, cast([DATE] as date), cast(dateadd(hour, datediff(hour, '1900', [DATE]), '1900') as time)
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.12.2020, 16:28  [ТС]
Спасибо за ответ.
Попробовал так:
T-SQL
1
2
3
4
5
6
7
 SELECT  
       shop
      ,count(shop) as 'count'
      ,dateadd(hour, datediff(hour, '1900', EventDate), '1900') as 'smth'
      ,EventDate
FROM [Table] where car ='Kuga'
group by shop, cast(dateadd(hour, datediff(hour, '1900', EventDate), '1900') as time),EventDate order by smth, EventDate
получилось вроде бы похоже на то, что я хочу увидеть:
shopcountsmtheventdate
Хлеб22020-06-24 00:00:00.0002020-06-24 00:01:39.000
Хлеб22020-06-24 00:00:00.0002020-06-24 00:21:19.000
Квас22020-06-24 00:00:00.0002020-06-24 00:20:54.000
Барсик22020-06-24 00:00:00.0002020-06-24 00:13:52.000
Хлеб12020-06-24 00:00:00.0002020-06-24 00:18:00.000
Хлеб22020-06-24 00:00:00.0002020-06-24 00:21:29.000
Хозтовары42020-07-03 12:00:00.0002020-07-03 12:34:44.000
Хозтовары12020-07-03 12:00:00.0002020-07-03 12:34:47.000
Премиум42020-07-03 12:00:00.0002020-07-03 12:34:48.000
Хозтовары32020-07-03 12:00:00.0002020-07-03 12:34:50.000
Метро22020-07-05 15:00:00.0002020-07-05 15:59:37.000
Метро12020-07-05 15:00:00.0002020-07-05 15:59:37.000
Чистый Город12020-07-05 15:00:00.0002020-07-05 15:59:46.000
Чистый Город42020-07-05 15:00:00.0002020-07-05 15:59:48.000
Но подсчитывается сумма событий не за час,а за каждую секунду
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
09.12.2020, 16:41
Цитата Сообщение от Landser Посмотреть сообщение
Но подсчитывается сумма событий не за час,а за каждую секунду
Потому что группировать нужно не по EventDate, а по cast(EventDate as date)
0
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.12.2020, 19:23  [ТС]
Спасибо за подсказку!

Вот так вообще красота:
T-SQL
1
2
3
4
5
6
7
SELECT  
       shop
      ,count(shop) as shop_count
      ,cast(EventDate as date) as data
      ,cast(dateaadd(hour, datediff(hour, '1900', EventDate), '1900') as time) 'hour'
FROM [table] where car ='Megan'
group by shop,cast(EventDate as date),cast(dateadd(hour, datediff(hour, '1900', EventDate), '1900') as time) order by data,hour
shopshop_countdatatime
Хлеб120.07.202017:00:00.0000000
Миссис Хадсон120.07.202017:00:00.0000000
Духи220.07.202018:00:00.0000000
Овощи220.07.202018:00:00.0000000
У Борца120.07.202018:00:00.0000000
Мясо1521.07.202022:00:00.0000000
Ц. Рынок121.07.202022:00:00.0000000
Камелот221.07.202022:00:00.0000000
Спасибо за совет!

Добавлено через 25 минут
Единственно не знаю, как добавить строки вида:

shopshop_countdatatime
--20.07.202017:00:00.0000000
--21.07.202022:00:00.0000000
--21.07.202022:00:00.0000000

если есть часы и дни, когда машина никуда не заезжала
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
09.12.2020, 20:54
Цитата Сообщение от Landser Посмотреть сообщение
Единственно не знаю, как добавить строки вида
Примерно так
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with h (EventDate, EventDate__max) as
(
 select cast(cast(min(EventDate) as date) as datetime), dateadd(day, 1, max(cast(EventDate as date)) from [table]
 union all
 select dateadd(hour, 1, t.EventDate) t.EventDate__max from h where dateadd(hour, 1, t.EventDate) < t.EventDate__max
)
select
 h.EventDate, t.shop, count(*)
from
 h left join
 [table] t on t.car ='Megan' and dateaadd(hour, datediff(hour, '1900', t.EventDate), '1900') = h.EventDate
group by
 h.EventDate, t.shop
order by
 h.EventDate
option
 (maxrecursion 0);
0
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.12.2020, 21:11  [ТС]
Спасибо.
Ssms ругается на псевдоним таблицы t. Это псевдоним для таблицы table в строке 3?

T-SQL
1
2
3
4
5
6
7
8
Сообщение 4104, уровень 16, состояние 1, строка 5
Не удалось привязать составной идентификатор "t.EventDate".
Сообщение 4104, уровень 16, состояние 1, строка 5
Не удалось привязать составной идентификатор "t.EventDate__max".
Сообщение 4104, уровень 16, состояние 1, строка 5
Не удалось привязать составной идентификатор "t.EventDate".
Сообщение 4104, уровень 16, состояние 1, строка 5
Не удалось привязать составной идентификатор "t.EventDate__max".
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.12.2020, 09:54
Landser, заменить t на h
0
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
10.12.2020, 12:52  [ТС]
invm , благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.12.2020, 12:52
Помогаю со студенческими работами здесь

Оконные функции
Здравствуйте. Возникла небольшая проблема. Есть некий сигнал - набор значений синуса, который имеет частоту 11 кГц. В модели Симулинк...

Оконные аналитические функции
Добрый вечер, есть таблица вида project id integer name character varying category character varying ...

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

На прямой задано n числовых интервалов. Определите, образует ли объединение этих интервалов один интервал
На прямой задано n числовых интервалов. Определите, образует ли объединение этих интервалов один интервал.

Функции: Определить даты предыдущих дней для n введеных дат
Задание: Описать две функции, одна из которых определяет, является ли год высокосным, а вторая возращает количество дней для M-го месяца...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru