我有一个数据库,其中包含用户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列,并确定数据集中每个人在一段时间内燃烧的卡路里总数。
答案 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