如何返回分组user_id的最近值?

时间:2014-04-10 07:43:20

标签: postgresql

我如何才能使结果只返回每个分组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)

1 个答案:

答案 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确保首先出现所需的行

,否则每个集合都是不可预测的