我如何才能使结果只返回每个分组user_id的最后一个条目。示例如下。
此外,我们非常感谢任何改进查询的方法。 properties
是一个hstore列。
SELECT user_id, json_agg(to_json(properties -> 'following')
ORDER BY id DESC) AS followings,
json_agg(to_json(properties -> 'assumed_gender') ORDER BY id DESC) AS assumed_genders,
json_agg(to_json(properties -> 'email') ORDER BY id DESC) AS emails,
json_agg(to_json(properties -> 'first_name') ORDER BY id DESC) AS first_names,
json_agg(to_json(properties -> 'last_name') ORDER BY id DESC) AS last_names,
json_agg(to_json(properties -> 'country_name') ORDER BY id DESC) AS country_names,
json_agg(to_json(properties -> 'city_name') ORDER BY id DESC) AS city_names,
json_agg(to_json(properties -> 'mobile_number') ORDER BY id DESC) AS mobile_numbers,
json_agg(to_json(properties -> 'submission_url') ORDER BY id DESC) AS submission_urls
FROM "daily_statistics" WHERE "daily_statistics"."campaign_id" = 72 AND "daily_statistics"."metric" = 'participation'
GROUP BY user_id ORDER BY max(id) DESC;
结果:
user_id | followings | assumed_genders | emails | first_names | last_names | country_names | city_names | mobile_number
s | submission_urls
---------+-------------------+-----------------+---------------------------------------+--------------------+--------------------+------------------+--------------------+---------------------
---------+------------------------------------------------------------------
16 | ["false", "true"] | ["", ""] | ["lorem@lorem.com", "lorem@amet.com"] | ["dolor", "ipsum"] | ["lorem", "ipsum"] | ["amet", "amet"] | ["dolor", "ipsum"] | ["9707759365", "2572
943441"] | ["http://www.dolor.com/hgtsjcbn", "http://www.sit.com/qlnogrzd"]
(1 row)
期望的结果:
user_id | followings | assumed_genders | emails | first_names | last_names | country_names | city_names | mobile_number
s | submission_urls
---------+-------------------+-----------------+---------------------------------------+--------------------+--------------------+------------------+--------------------+---------------------
---------+------------------------------------------------------------------
16 | "true" | "" | "lorem@amet.com" | "ipsum" | "ipsum" | "amet" | "ipsum" | "2572
943441" | "http://www.sit.com/qlnogrzd"
(1 row)
答案 0 :(得分:2)
使用distinct on
select distinct on (user_id)
user_id,
to_json(properties -> 'following') as followings,
to_json(properties -> 'assumed_gender') as assumed_genders,
to_json(properties -> 'email') as emails,
to_json(properties -> 'first_name') as first_names,
to_json(properties -> 'last_name') as last_names,
to_json(properties -> 'country_name') as country_names,
to_json(properties -> 'city_name') as city_names,
to_json(properties -> 'mobile_number') as mobile_numbers,
to_json(properties -> 'submission_url') as submission_urls
from "daily_statistics"
where
"daily_statistics"."campaign_id" = 72
and "daily_statistics"."metric" = 'participation'
order by user_id, id desc
http://www.postgresql.org/docs/current/static/sql-select.html
SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。注意"第一行"除非使用ORDER BY确保首先出现所需的行
,否则每个集合都是不可预测的