如何选择多个用户ID和几天的每天的最后一个时间戳读数?

时间:2019-01-30 21:58:36

标签: mysql sql

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

IN:

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

OUT:

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列,并确定数据集中每个人在一段时间内燃烧的卡路里总数。

1 个答案:

答案 0 :(得分:1)

您似乎正在使用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