首页 > 解决方案 > 如何为多个用户 ID 和多天选择每天的最后一个时间戳读数?

问题描述

我有一个数据库,其中包含用户 ID、燃烧的卡路里(值)和记录这些卡路里燃烧的时间戳(读数日期)。一个人在同一天可能有多个卡路里读数,但我只对最后一个读数感兴趣,因为它是当天所有先前读数的总和。

在:

SELECT 
  DISTINCT ON (date, user_contents.content_id)
  date_trunc('day',reading_date + time '05:00') date,
   user_id,
   created_at,
   value
FROM data

出去:

date                | user_id |  created_at            | value
2019-01-13 00:00:00 | 138     | 2019-01-18 06:07:52    | 81.0
2019-01-15 00:00:00 | 137     | 2019-01-15 15:43:25    | 87.0
2019-01-16T00:00:00 | 137     | 2019-01-18 04:22:11    | 143.0
2019-01-16T00:00:00 | 137     | 2019-01-18 06:12:11    | 230.0
additional values omitted

我希望能够选择每人每天的最大读数值。我尝试过使用 DISTINCT 语句,例如:

SELECT
DISTINCT ON (date, user_contents.content_id)
  date_trunc('day',reading_date + time '05:00') date,

有时这会导致错误消息:

SELECT DISTINCT ON expressions must match initial ORDER BY expressions

有时它会过滤掉一些结果,但并不总是给我当天的最后一次读数,或者每人每天只有一个结果。

我的最佳最终结果如下所示(第三条记录已被删除):

date                | user_id |  created_at            | value
2019-01-13 00:00:00 | 138     | 2019-01-18 06:07:52    | 81.0
2019-01-15 00:00:00 | 137     | 2019-01-15 15:43:25    | 87.0
2019-01-16T00:00:00 | 137     | 2019-01-18 06:12:11    | 230.0
additional values omitted

最终,我将使用这些数据来汇总 value 列,并确定数据集中每个人在一段时间内燃烧的卡路里总数。

标签: mysqlsql

解决方案


您似乎正在使用 Postgres。

按照错误消息中的说明进行操作。你想要这样的东西:

SELECT DISTINCT ON (user_id, reading_date::date)
       date_trunc('day',reading_date + time '05:00') date,
       user_id, created_at,value
FROM data
ORDER BY user_id, reading_date::date DESC, reading_date DESC

推荐阅读