SQLAlchemy - 如何获取最新记录的1分钟和同一分钟内的所有记录?

时间:2014-04-05 17:35:18

标签: python mysql sqlalchemy

我的表有一个日期时间列,记录行更新的时间;称之为col_datetime。我需要在col_datetime中获取具有最新日期时间的行以及在该记录的一分钟内具有相同分钟的所有其他记录。例如:

pk  | first  | col_datetime
1     Dave     2014-03-23 8:23:57
2     Dan      2014-03-23 8:22:59
3     Teresa   2014-03-23 8:23:01 
4     Marge    2013-03-23 8:23:08

在我的情况下,我需要查询返回第1行和第3行(即使第2行在记录#1的1分钟内,它不是同一分钟。同样,第4行具有相同的分钟但是是一年前。)

我在mysql中的尝试只返回第1行(虽然我需要SQLAlchemy的解决方案):

SELECT * FROM (SELECT * FROM `mytable`
        ORDER BY col_datetime DESC LIMIT 1) as sub 
        WHERE col_datetime >= sub.col_datetime - INTERVAL 1 MINUTE 
        AND EXTRACT(MINUTE FROM col_datetime) = EXTRACT(MINUTE FROM sub.col_datetime)

我很感激帮助!

1 个答案:

答案 0 :(得分:3)

此sql查询将返回正确的数据:

select * from foo;
+----+--------+---------------------+
| id | name   | col_date            |
+----+--------+---------------------+
|  1 | Bob    | 2014-04-05 19:57:53 |
|  2 | Robert | 2014-04-05 19:58:15 |
|  3 | Fred   | 2014-04-05 19:58:25 |
|  4 | Frank  | 2014-04-05 19:58:48 |
+----+--------+---------------------+

select foo.* 
  from foo,   
  (select convert( DATE_FORMAT(max(col_date), '%Y-%m-%d %H:%i:00'), DATETIME) as minute_base from foo) b   
where foo.col_date >= b.minute_base and
      foo.col_date < b.minute_base + INTERVAL 1 MINUTE;

Sqlalchemy不支持开箱即用的DATE_FORMAT或INTERVAL等服务器端功能。要在服务器端执行此操作,请创建自定义sql构造(SQLAlchemy datetime operations on server side)。

在客户端有两个查询:

minute = conn.execute(select([func.max(foo.c.col_date, type=DateTime)])).scalar().replace(second=0)
max_minute = minute + datetime.timedelta(minutes=1)
conn.execute(select([foo]).\
...:     where(foo.c.col_date >= minute).\
...:     where(foo.c.col_date < max_minute)).fetchall()

[(2, 'Robert', datetime.datetime(2014, 4, 5, 19, 58, 15)),
 (3, 'Fred', datetime.datetime(2014, 4, 5, 19, 58, 25)),
 (4, 'Frank', datetime.datetime(2014, 4, 5, 19, 58, 48))]

PS max_minute可能有点矫枉过正。