如何在 PostgreSQL 中获取表的每一天的第一个日期并将其转换为 JSON
Posted
技术标签:
【中文标题】如何在 PostgreSQL 中获取表的每一天的第一个日期并将其转换为 JSON【英文标题】:How to get the first date of each day of a table in PostgreSQL and convert it into a JSON 【发布时间】:2019-08-27 20:31:20 【问题描述】:正如问题所说,我想获得从具有“N”个项目和列的表的每个日期获得的第一个值,但有一个 timestamp field without time zone
和我想在 JSON 中连接的那些值在一个数组中。
查询接收到日期间隔类型Date
。 start date
和 end date
例如,我有一张桌子
ID | fecha
1 "2019-05-18 13:55:54"
2 "2019-05-18 13:57:22"
3 "2019-05-18 13:57:37"
4 "2019-05-18 13:58:07"
5 "2019-05-18 13:58:37"
6 "2019-05-18 13:58:48"
7 "2019-05-19 13:55:54"
8 "2019-05-19 13:57:22"
9 "2019-05-19 13:57:37"
10 "2019-05-20 13:58:07"
11 "2019-05-20 13:58:37"
12 "2019-05-20 13:58:48"
如果我通过例如start_day : '2019-05-18'
和end_date: '2019-05-20'
,我想得到这个
预期结果
["id" : 1, "fecha" :"2019-05-18 13:55:54","id" : 7, "fecha" :"2019-05-19 13:55:54","id" : 10, "fecha" :"2019-05-20 13:58:48"]
我将使用json_agg
和json_build_object
来获取数组中的JSON,但我不知道如何在简单的查询中获取每天的第一个日期。如果你能帮助我,我将不胜感激
【问题讨论】:
【参考方案1】:您可以使用distinct on
获取每天的第一个条目,同时仍保持完整的时间戳。
select json_agg(d)
FROM (SELECT distinct on (fecha::date)
json_build_object('id', id, 'fecha', fecha) as d
FROM test
ORDER BY fecha::date, fecha)
sub;
json_agg
------------------------------------------------------------------------------------------------------------------------------------------
["id" : 1, "fecha" : "2019-05-18T13:55:54", "id" : 7, "fecha" : "2019-05-19T13:55:54", "id" : 10, "fecha" : "2019-05-20T13:58:07"]
(1 row)
【讨论】:
【参考方案2】:只需将其转换为日期并对其进行分组,选择每个日期的最小时间戳:
SELECT fecha::date, min(fecha)
FROM table
GROUP BY fecha::date
投射到日期有效地剥夺了时间,给你“每天”的要求,然后那一天的第一个时间戳由分钟给出。您的 id 似乎是连续的;您也可以将其最小化,因为最小值在一天也将是最小时间戳。如果有任何机会 id 不是连续的,请发表评论,我会给出进一步的建议
【讨论】:
以上是关于如何在 PostgreSQL 中获取表的每一天的第一个日期并将其转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章
mysql数据库中sql语句取一段时间的每一天的最后一条数据?sql语句怎么写