如何在 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 中。
查询收到天数间隔类型Date
。 start date
和 end 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_agg
和 json_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)
如问题所述,我想获得从 table 的每个日期获得的第一个值,该 table 具有 "N" 个项目和列,但具有 timestamp field without time zone
和我想将这些值连接到数组中的 JSON 中。
查询收到天数间隔类型Date
。 start date
和 end 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_agg
和 json_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)