powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой по дате
9 сообщений из 9, страница 1 из 1
Хитрый запрос с группировкой по дате
    #33856924
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с полями:
Код: plaintext
1.
2.
событие text,
дата начала события timestamp,
дата окончания события timestamp
хочется сделать запрос типа:
Код: plaintext
1.
2.
3.
SELECT to_char('дата начала события', 'YYYY-MM'), count(событие)
FROM таблица
WHERE 'дата начала события' BETWEEN 'не важно' AND 'тоже не важно'
GROUP BY to_char('дата начала события', 'YYYY-MM')
но чтобы шёл подсчет не по тому, что событие началось в этом месяце,
а по тому, что событие присутствовало (т.е началось в этом месяце или раньше и закончилось в этом месяце или позже).
Не перемудрил?
Наверное, у многих такие вопросы возникали.
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33856941
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно, то я вообще не понял, с чем у тебя возникли сложности?
С определением того, пересекаются ли интервалы действия события с заданным интервалом?
Или-таки порблемы заключается в чем-то другом?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33856943
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не сложно, то приведи тестовые данные, и то, что ты на них хочешь получить.
Пары тройки строк на два-три события будет вполне достаточно.


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33856996
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор КоневЕсли честно, то я вообще не понял, с чем у тебя возникли сложности?
С определением того, пересекаются ли интервалы действия события с заданным интервалом?
Или-таки порблемы заключается в чем-то другом?

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
Совершенно верно, с пересекающимися интервалами
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33857041
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор КоневЕсли не сложно, то приведи тестовые данные, и то, что ты на них хочешь получить.
Пары тройки строк на два-три события будет вполне достаточно.

Таблица:
Код: plaintext
1.
2.
3.
4.
событие1, '2006-1-1', '2006-6-1'
событие2, '2006-2-1', '2006-7-1'
событие3, '2006-3-1', '2006-8-1'
событие4, '2006-4-1', '2006-9-1'
результат запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
'2006-01'    1 
'2006-02'    2 
'2006-03'    3 
'2006-04'    4 
'2006-05'    4 
'2006-06'    4 
'2006-07'    3 
'2006-08'    2 
'2006-09'    1 
'2006-10'    0 
примерно так
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33857053
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если 'дата начала события' <= 'дата окончания события', то WHERE 'дата начала события' <= 'тоже не важно' AND 'дата окончания события' >= 'не важно'
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33857114
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть у нас есть таблица T с событиями, вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from t

Query finished, retrieving results...

  EVENT      B_DATE       E_DATE
--------   ----------   ----------
событие1    1 -янв- 2006     1 -июн- 2006 
событие2    1 -фев- 2006     1 -июл- 2006 
событие3    1 -мар- 2006     1 -авг- 2006 
событие4    1 -апр- 2006     1 -сен- 2006 

 4  row(s) retrieved

ПУсть у нас есть таблица V с заданными интервалами дат (её можно формировать дтинамически, как встроенное представление):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select * from v

Query finished, retrieving results...

RN    START_DT      END_DT
--   ----------   -----------
  1     1 -янв- 2006     31 -янв- 2006 
  2     1 -фев- 2006     28 -фев- 2006 
  3     1 -мар- 2006     31 -мар- 2006 
  4     1 -апр- 2006     30 -апр- 2006 
  5     1 -май- 2006     31 -май- 2006 
  6     1 -июн- 2006     30 -июн- 2006 
  7     1 -июл- 2006     31 -июл- 2006 
  8     1 -авг- 2006     31 -авг- 2006 
  9     1 -сен- 2006     30 -сен- 2006 
 10     1 -окт- 2006     31 -окт- 2006 

 10  row(s) retrieved

Вот запрос, который выдаст интересующий нас результат:
Код: plaintext
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.
select start_dt, 
       end_dt, 
       count(event) cnt
  from v
  left join 
       t
-- Это условие фактически и проверяет пересечение интервалов :
    on (b_date <= end_dt and e_date >= start_dt) 
 group by end_dt, start_dt

Query finished, retrieving results...

 START_DT      END_DT      CNT              
----------   -----------   ---
 1 -янв- 2006     31 -янв- 2006       1  
 1 -фев- 2006     28 -фев- 2006       2  
 1 -мар- 2006     31 -мар- 2006       3  
 1 -апр- 2006     30 -апр- 2006       4  
 1 -май- 2006     31 -май- 2006       4  
 1 -июн- 2006     30 -июн- 2006       4                                      
 1 -июл- 2006     31 -июл- 2006       3                                      
 1 -авг- 2006     31 -авг- 2006       2                                      
 1 -сен- 2006     30 -сен- 2006       1                                      
 1 -окт- 2006     31 -окт- 2006       0                                      

 10  row(s) retrieved


-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33857200
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев
Вот запрос, который выдаст интересующий нас результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select start_dt, 
       end_dt, 
       count(event) cnt
  from v
  left join 
       t
-- Это условие фактически и проверяет пересечение интервалов :
    on (b_date <= end_dt and e_date >= start_dt) 
 group by end_dt, start_dt

Идею понял. Всем спасибо.
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой по дате
    #33858186
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такое ещё есть: оператор OVERLAPS (типа "перекрытие").
(Тут есть поное описание.)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  ( DATE '2001-02-16', DATE '2001-12-21' ) OVERLAPS
  ( DATE '2001-10-30', DATE '2002-10-30' );

-- Result: true

SELECT
  ( DATE '2001-02-16', INTERVAL '100 days' ) OVERLAPS
  ( DATE '2001-10-30', DATE '2002-10-30' );

-- Result: false

...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой по дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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