PSQL выбрать максимальное значение в минуту на идентификатор для нескольких значений в минуту на идентификатор? - PullRequest
1 голос
/ 14 декабря 2009

Учитывая таблицу, которая выглядит следующим образом:

 sensor_id |          time          |  voltage
-----------+------------------------+------------
     12292 | 2009-12-01 00:50:04-07 |       2270
     12282 | 2009-12-01 00:50:04-07 |      93774
     12192 | 2009-12-01 00:50:04-07 |       9386
     12609 | 2009-12-01 00:50:05-07 |          0
     12566 | 2009-12-01 00:50:08-07 |          0
     12659 | 2009-12-01 00:50:19-07 |        540
     12660 | 2009-12-01 00:50:19-07 |        550
     12661 | 2009-12-01 00:50:19-07 |        510
     12656 | 2009-12-01 00:50:19-07 |      30240
     12657 | 2009-12-01 00:50:19-07 |      14930
     12658 | 2009-12-01 00:50:19-07 |      17420
     11820 | 2009-12-01 00:50:26-07 |       1.38
     11832 | 2009-12-01 00:50:28-07 |      1.359
     12768 | 2009-12-01 00:50:33-07 |     636588
     13192 | 2009-12-01 00:50:34-07 |      1.401
         .                        .            .
         .                        .            .
         .                        .            .

Бывают случаи, когда вы получаете записи, похожие на:

     12292 | 2009-12-01 00:50:04-07 |       2270
     12282 | 2009-12-01 00:50:04-07 |      93774
     12192 | 2009-12-01 00:50:04-07 |       9386
     12609 | 2009-12-01 00:50:05-07 |          0
     12566 | 2009-12-01 00:50:08-07 |          0
     12659 | 2009-12-01 00:50:19-07 |        540     *
     12659 | 2009-12-01 00:50:45-07 |        541     *
     12660 | 2009-12-01 00:50:19-07 |        550
     12661 | 2009-12-01 00:50:19-07 |        510
     12656 | 2009-12-01 00:50:19-07 |      30240
     12657 | 2009-12-01 00:50:19-07 |      14930
     12658 | 2009-12-01 00:50:19-07 |      17420
     11820 | 2009-12-01 00:50:26-07 |       1.38     #
     11832 | 2009-12-01 00:50:28-07 |      1.359
     11820 | 2009-12-01 00:50:28-07 |        1.3     #
     12768 | 2009-12-01 00:50:33-07 |     636588
     13192 | 2009-12-01 00:50:34-07 |      1.401
         .                        .            .
         .                        .            .
         .                        .            .

Обратите внимание на размеченные и хешированные строки. Каждое из показаний берется в одну и ту же минуту, но мне нужно только одно значение в минуту, предпочтительно максимальное значение. Я попробовал:


select sensor_id, read_time, voltage 
from table 
where (sensor_id, read_time) 
in (select sensor_id, max(read_time) 
    from table 
    group by sensor_id);

Это, очевидно, не работает, но я думаю, что я на правильном пути?


Для интересующихся финальный код выглядит так:

select sensor_id, date_trunc('minute', read_time), max(voltage) 
from table 
group by sensor_id, date_trunc('minute', read_time) 
order by date_trunc('minute', read_time); 
 

Ответы [ 3 ]

2 голосов
/ 14 декабря 2009

Что-то вроде

SELECT sensor_id, date_trunc('minute',time), max(voltage)
FROM t
GROUP BY sensor_id, date_trunc('minute',time)

может быть то, что вы ищете?

1 голос
/ 14 декабря 2009

Вы должны сгруппировать по выражению, которое «определяет» интервалы в одну минуту, в которых вы хотите получить максимальные значения:

select sensor_id, DateHourMinuteFunction(read_time), Max(voltage) 
from table 
Group By sensor_id, DateHourMinuteFunction(read_time)

Где DateHourMinuteFunction(read_time) - это некоторая функция или выражение Sql в вашей базе данных, которая будет возвращать выражение, одинаковое для любого read_time в ту же минуту (т. Е. Ему нужно убрать значения секунд)

Может ли ваша база данных преобразовать дату и время в строку? Если это так, то как минимум напишите выражение, которое преобразует его в строку, отформатированную как месяц, год, час, минута, секунда, а затем уберет часть секунд ...

Предполагая, что в столбце datetime у вас уже есть строка, просто используйте для нее подстроку ...

select sensor_id, SubString(Cast(read_time as varChar(22)), 0, 16), Max(voltage) 
from table 
Group By sensor_id, SubString(Cast(read_time as varChar(22)), 0, 16)
0 голосов
/ 14 декабря 2009

Я работаю с MS SQL, а не с Oracle, по большей части, так что я не знаю всех функций Oracle для датирования. Что вы в основном хотите сделать, так это присоединиться к столу, в котором ваши минуты разбиты по времени начала и окончания. Он может быть сгенерирован на лету как своего рода подзапрос или у вас может быть постоянная таблица в вашей базе данных со всеми диапазонами. Затем код работает примерно так:

SELECT
     T.sensor_id,
     DR.start_time AS read_time_minute,
     MAX(T.voltage) AS voltage
FROM
     Date_Ranges DR
INNER JOIN My_Table T ON
     T.read_time BETWEEN DR.start_time AND DR.end_time
WHERE
     DR.start_time >= <report start time> AND
     DR.start_time < <report end time>

Если вы хотите указать время, когда измерения не проводились, измените ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ. Время начала и окончания будет выглядеть примерно так: «2009-12-14 00:00:00», «2009-12-14 00: 02: 00»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...