Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 24

Запрос на выборку данных с группировкой по суткам

11.02.2019, 14:18. Показов 6470. Ответов 9

Студворк — интернет-сервис помощи студентам
Добрый день!

Прошу подсказать в написании запроса к базе с выводом данных по суткам
Имеется база с данными



Делаю запрос
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT date_trunc('hour',id.datetime) AS Дата,
MIN(channel35.val) AS ГЛ_V,
MIN(channel36.val) AS ГП_V
FROM
((SELECT datetime FROM cnldata) id LEFT JOIN
(SELECT datetime, val FROM cnldata WHERE cnlnum=35) channel35 ON channel35.datetime=id.datetime LEFT JOIN
(SELECT datetime, val FROM cnldata WHERE cnlnum=36) channel36 ON channel36.datetime=id.datetime)
WHERE
id.datetime BETWEEN '2017-01-01 09:00:00' AND '2018-01-03 09:10:00'
GROUP BY date_trunc('hour',id.datetime)
ORDER BY date_trunc('hour',id.datetime) ASC
Получаю




Вопрос в том, как изменить запрос что бы получить записи сгруппированные по 12 часов (по суткам)
пробовал так date_trunc('day',id.datetime) вроде работает но выдает данные от 9 часов до 0 часов , а мне надо от 9 часов текущих до 9 часов следующих суток

как то так , но что бы сутки равнялись указанных мной часам
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2019, 14:18
Ответы с готовыми решениями:

Запрос на выборку с группировкой бд Парковки
Доброго времени суток! Подскажите, пожалуйста у самого мозг не дотягивает. Есть две таблицы со связью один ко многим. 1. т_ОПП с...

Запрос на выборку, ошибка с группировкой и подсчетом
Собственно проблема - пытаюсь сделать запрос на выборку с группировкой по смене и с подсчетом количества броней, у которых дата...

Не могу составить запрос с группировкой данных
Здравствуйте. Никак не могу сообразить, как составить запрос, делающий выборку из таблицы (см. в конце сообщения) по следующему принципу: ...

9
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
11.02.2019, 14:29
Такой вариант подойдет?

SQL
1
SELECT * FROM action_log.actions WHERE response_time > '2018-10-10 13:32:52'::TIMESTAMP AND response_time < '2018-10-13 13:32:52'::TIMESTAMP;
Выводит все записи в промежутке времени. Время для промежутка можете задать совершенно любое
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 24
11.02.2019, 14:50  [ТС]
Нет, вы видимо не уловили мою мысль. Да ваш вариант работает для вывода любого указанного периода времени.
Но для моей выборки он не приемлем. BETWEEN '2017-01-01 09:00:00' AND '2018-01-03 09:10:00' делает то же самое.

Добавлено через 7 минут
Моя цель: вывести показания счетчика на каждые сутки в 9:00

Вот и ломаю голову, счетчик постоянно накапливает регистр , вот и применяю функцию MIN() для поиска минимального значения за сутки. Возможно как то иначе можно, вывести 9:00 часовые срезы на каждые сутки, но то же с условием, счетчик может и не дать значения четко на 9 утра а на 9:00:20 или 9:01:34. Приходиться находить тот минимум

Тем более вся куча записей не нужна, лишь те что нужно
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
12.02.2019, 22:48
1) у вас по-моему скрины перепутаны. Первым идет уже результат вашего запроса, а вторым идут исходные данные.
2) советую пока оставить в покое LEFT JOIN по пропущенным данным. Их вы уже в конце добавите, когда получите посчитанные данные из общей выборки. LEFT JOIN дорогая операция, делать ее для "сырых" данных накладно.
3) чтобы перейти на 9 часов, нужно эти 9 часов отнять от исходного timestamp, потом снова прибавите. то есть мы как бы сутки сдвигаем на 9 часов.

Ну вот как-то так попробуйте

SQL
1
2
3
4
5
6
7
8
SELECT dt + '9 hours'::INTERVAL AS dt, COALESCE(ch35, 0), COALESCE(ch36, 0)
FROM
(SELECT date_trunc('hour', d.datetime - '9 hours'::INTERVAL) AS dt, 
MIN(CASE d.cnlnum WHEN 35 THEN d.val ELSE NULL END) AS ch35,
MIN(CASE d.cnlnum WHEN 36 THEN d.val ELSE NULL END) AS ch36
FROM cnldata AS d WHERE d.cnlnum IN (35,36)
GROUP BY date_trunc('hour', d.datetime - '9 hours'::INTERVAL)) AS X
ORDER BY dt;
Добавлено через 3 минуты
забыл указать условие по датам! допишите уже сами после IN
SQL
1
AND datetime BETWEEN 'XXX' AND 'YYY'
Добавлено через 1 минуту
в BETWEEN даты сдвигать не надо. тут мы их отбираем так, как они реально были зафиксированы
1
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 24
13.02.2019, 04:18  [ТС]
Да скрины перепутал, заметил сам.
Не понял про сдвиг дат AND datetime BETWEEN 'XXX' AND 'YYY'
'2017-01-01 09:00:00' AND '2018-01-03 09:10:00' - так не надо писать?
Тогда как именно указать период по датам, ткните пальцем
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
13.02.2019, 05:29
Лучший ответ Сообщение было отмечено hizkiyau как решение

Решение

Цитата Сообщение от hizkiyau Посмотреть сообщение
'2017-01-01 09:00:00' AND '2018-01-03 09:10:00' - так не надо писать?
вот как раз так и надо написать
1
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 24
13.02.2019, 06:13  [ТС]
Вроде получилось, в таком варианте

SQL
1
2
3
4
5
6
7
8
9
SELECT dt + '9 hours'::INTERVAL AS Дата, COALESCE(ch35, 0) AS ГЛ_V , COALESCE(ch36, 0) AS ГП_V
FROM
(SELECT date_trunc('day', d.datetime - '9 hours'::INTERVAL) AS dt, 
MIN(CASE d.cnlnum WHEN 35 THEN d.val ELSE NULL END) AS ch35,
MIN(CASE d.cnlnum WHEN 36 THEN d.val ELSE NULL END) AS ch36
FROM cnldata AS d WHERE d.cnlnum IN (35,36) AND 
datetime BETWEEN '2017-01-01 09:00:00' AND '2017-01-05 09:10:00'
GROUP BY date_trunc('day', d.datetime - '9 hours'::INTERVAL)) AS X
ORDER BY dt;
Добавлено через 8 минут
Да еще не подскажите одну вещь

В Access есть такая функция IIF(УСЛОВИЕ;ЕСЛИ_ДА;ЕСЛИ_НЕТ), Мне она очень нравилась
в сочетании с Min() удавалось выбирать значения без учета 0

MIN(IIF([ГЛ_V]<>0,[ГЛ_V],NULL))

Вопрос как Postgre это сделать?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
13.02.2019, 23:33
Лучший ответ Сообщение было отмечено hizkiyau как решение

Решение

Цитата Сообщение от hizkiyau Посмотреть сообщение
Вопрос как Postgre это сделать?
CASE здесь должен помочь. Прямого аналога я не знаю.
1
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 24
18.02.2019, 19:52  [ТС]
Если не трудно, помогите еще немного
date_trunc('day', d.datetime - '9 hours'::INTERVAL) AS dt

как передать параметр в место 'day'

пробовал так .Parameters.Add("@dt_first", OdbcType.Text).Value = "day" не хочет принимать
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
19.02.2019, 07:17
По VBA не подскажу, не знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2019, 07:17
Помогаю со студенческими работами здесь

Запрос к среднему по месяцу, суткам и по часам
В общем задача вообще хитрая и вот даж не знаю выполнимая али как. хочу получить данные с постгрес вида ид | значение 1 за n час |...

Как сделать выборку с группировкой по дате?
Здравствуйте. Подскажите как сделать группировку с выборкой по дате? Имеется таблица в которой указано поле data. На странице нужно...

Запрос на выборку данных
&quot;из таблицы Виды работ вывести все данные о конкретной работе (например, о работе Пошив костюма).&quot; Объясните пожалуйста как примерно...

Запрос на выборку данных
имеется БД с таблицами Сотрудники (ФИО,отдел специальность и т.д.), Специальность(код специальности, название) и Вакансии(специальность,...

Запрос на выборку данных
Здравствуйте, нужна помощь в составление запроса. Нужно что бы после выборки вместо Idperson1,IdPerson2,Idperson3 отображались ФИО...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru