SQL - 过去X天每天插入的第一行

时间:2010-06-18 03:39:42

标签: sql database timestamp

一个棘手的SQL问题(我顺便使用postgres)。

我需要在过去的X天里每天插入第一行。我的一个列是时间戳,我保持插入时间,另一列是行ID。

如果不可能每天插入第一行,我至少需要一个独特的行;过去x天每天一行。

有什么建议吗?

由于

okie

2 个答案:

答案 0 :(得分:4)

你可能想尝试类似下面的内容(在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)

答案 1 :(得分:3)

瓦萨洛先生,你是摇滚明星。

效果很好。这是你的SQL的postgres版本:

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;

不需要获取最小ID,因为我不能保证插入将按照时间顺序排列(时间戳实际上不是插入的时间,而是存储在数据中的时间戳,数据包可以出来订单)。

我真的很感激帮助。谢谢你看看这个。