如何在 PostgreSQL 中获取 table 的每一天的第一个日期并将其转换为 JSON

How to get the first date of each day of a table in PostgreSQL and convert it into a JSON

如问题所述,我想获得从 table 的每个日期获得的第一个值,该 table 具有 "N" 个项目和列,但具有 timestamp field without time zone 和我想将这些值连接到数组中的 JSON 中。

查询收到天数间隔类型Datestart dateend date

例如,我有一个 table 和

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_aggjson_build_object 来获取数组中的 JSON,但我不知道如何在简单查询中获取每一天的第一个日期。如果你能帮助我,我将不胜感激

只需将其转换为日期并对其进行分组,选择每个日期的最小时间戳:

SELECT fecha::date, min(fecha)
FROM table
GROUP BY fecha::date

投射到日期有效地去除了时间,给你你的 "per day" 要求,然后那一天的第一个时间戳由最小值给出。您的 ID 似乎是连续的;你也可以将它最小化,因为最小值是在一天中也将是最小时间戳。如果 id 有可能不是连续的,请发表评论,我会给出进一步的建议

您可以使用 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)