SQL - первая строка вставляется каждый день за последние X дней - PullRequest
2 голосов
/ 18 июня 2010

Сложный вопрос SQL (кстати, я использую postgres).

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

Если невозможно вставлять первую строку каждый день, мне, по крайней мере, нужен уникальный; одна строка для каждого дня за последние x дней.

Есть предложения?

Спасибо

Ока

Ответы [ 2 ]

4 голосов
/ 18 июня 2010

Возможно, вы захотите попробовать что-то вроде следующего (протестировано в MySQL, но я думаю, что это должно быть легко портировать на Postgres):

SELECT      l.id, l.timestamp, l.value
FROM        log l
INNER JOIN  (
             SELECT    MIN(timestamp) first_timestamp
             FROM      log
             GROUP BY  DATE(timestamp)
            ) sub_l ON (sub_l.first_timestamp = l.timestamp)
WHERE       l.timestamp > DATE_ADD(NOW(), INTERVAL -30 DAY);

Обратите внимание, что это предполагает, что ваши метки времени являются уникальными.

Контрольный пример (в MySQL):

CREATE TABLE log (id int, timestamp datetime, value int);

INSERT INTO log VALUES (1, '2010-06-01 02:00:00', 100);
INSERT INTO log VALUES (2, '2010-06-01 03:00:00', 200);
INSERT INTO log VALUES (3, '2010-06-01 04:00:00', 300);
INSERT INTO log VALUES (4, '2010-06-02 02:00:00', 400);
INSERT INTO log VALUES (5, '2010-06-02 03:00:00', 500);
INSERT INTO log VALUES (6, '2010-06-03 02:00:00', 600);
INSERT INTO log VALUES (7, '2010-06-04 02:00:00', 700);
INSERT INTO log VALUES (8, '2010-06-04 03:00:00', 800);
INSERT INTO log VALUES (9, '2010-06-05 05:00:00', 900);
INSERT INTO log VALUES (10, '2010-06-05 03:00:00', 1000);

Результат:

+------+---------------------+-------+
| id   | timestamp           | value |
+------+---------------------+-------+
|    1 | 2010-06-01 02:00:00 |   100 |
|    4 | 2010-06-02 02:00:00 |   400 |
|    6 | 2010-06-03 02:00:00 |   600 |
|    7 | 2010-06-04 02:00:00 |   700 |
|   10 | 2010-06-05 03:00:00 |  1000 |
+------+---------------------+-------+
5 rows in set (0.00 sec)
3 голосов
/ 18 июня 2010

Мистер Вассалло, вы рок-звезда.

это отлично сработало.Вот версия Postgres вашего SQL:

SELECT l.id, l.timestamp, l.value
FROM log l
INNER JOIN  (
             SELECT    MIN(timestamp) AS first_timestamp
             FROM      log
             GROUP BY  DATE(timestamp)
) sub_l ON (sub_l.first_timestamp = l.timestamp)
WHERE       l.timestamp > NOW() - INTERVAL '30 DAY' ORDER BY l.timestamp;

нет необходимости получать минимальный идентификатор, потому что я не могу гарантировать, что вставки будут в прямом хронологическом порядке (отметка времени не является действительно вставленным, но временная метка находится в данных, и пакеты данных могут выходить из строя).

Я действительно ценю помощь.спасибо, что взглянули на это.

...