Postgresql-选择“投票”计数,但仅包括最新的
我已经盯着这个看了20分钟了,都没法想清楚。我以前做过,只是不记得在哪个项目中,所以我可以引用代码 我有一张这样的桌子:Postgresql-选择“投票”计数,但仅包括最新的,postgresql,Postgresql,我已经盯着这个看了20分钟了,都没法想清楚。我以前做过,只是不记得在哪个项目中,所以我可以引用代码 我有一张这样的桌子: votes [table] id - serial , primary useraccount_id - id object_id - id vote - int timestamp_vote - timestamp 我需要能够选择任何一个对象的当前投票总数 但是,此表也充当“时间线”视图。请注意,我使用的是一个序列作为id列。useraccount\u
votes [table]
id - serial , primary
useraccount_id - id
object_id - id
vote - int
timestamp_vote - timestamp
我需要能够选择任何一个对象的当前投票总数
但是,此表也充当“时间线”视图。请注意,我使用的是一个序列作为id列。useraccount\u id+object\u id可能有多条记录
不幸的是,这不是我需要的:
SELECT
vote , count(vote)
FROM
votes
WHERE
object_id = 161
GROUP BY
vote ;
我知道需要使用子查询和distinct,以及“order by timestamp desc”,以限制给定用户的最新投票。我只是不记得怎么把选择串在一起
-添加示例数据-
样本数据
id | object_id | useraccount_id | timestamp_created | vote
----+------------+----------------+----------------------------+------------
2 | 153 | 57 | 2012-12-11 18:37:20.421013 | 1
3 | 153 | 57 | 2012-12-11 18:48:39.963748 | 2
4 | 153 | 57 | 2012-12-11 18:48:42.869945 | 3
5 | 153 | 57 | 2012-12-11 18:48:48.991617 | 1
6 | 153 | 57 | 2012-12-11 19:34:26.701351 | 2
7 | 153 | 57 | 2012-12-11 19:35:52.449031 | 3
8 | 153 | 57 | 2012-12-11 19:35:52.986822 | 1
9 | 153 | 57 | 2012-12-11 19:35:53.850291 | 2
10 | 153 | 58 | 2012-12-11 19:35:55.884202 | 3
12 | 153 | 58 | 2012-12-11 19:35:56.803337 | 1
13 | 153 | 59 | 2012-12-11 19:37:04.563519 | 3
15 | 153 | 60 | 2012-12-11 19:37:40.618324 | 3
16 | 153 | 61 | 2012-12-11 19:37:40.618324 | 3
17 | 153 | 62 | 2012-12-11 19:37:40.618324 | 3
18 | 153 | 63 | 2012-12-11 19:37:40.618324 | 2
预期产出为:
vote | count
-----+------
1 | 1 # user 58 cast a vote of `3` , then `1`. only the latest vote of `1` counted.
2 | 2 # user 57 switched votes many times. only their last vote of `2` counted. user 63 cast a vote of `2` as well.
3 | 4 # users 59,60,61,62 all voted `3`
您可以尝试类似的方法:
SELECT DISTINCT ON (useraccount_id, object_id)
vote,
timestamp_vote,
useraccount_id,
object_id
FROM votes
WHERE object_id = 161 -- your filter here
ORDER BY useraccount_id, object_id, timestamp_vote DESC
它将为您提供每个用户帐户id、对象id的最后一票
然后:
计算选票
详细信息:,您可以尝试以下内容:
SELECT DISTINCT ON (useraccount_id, object_id)
vote,
timestamp_vote,
useraccount_id,
object_id
FROM votes
WHERE object_id = 161 -- your filter here
ORDER BY useraccount_id, object_id, timestamp_vote DESC
它将为您提供每个用户帐户id、对象id的最后一票
然后:
计算选票
详细信息:,请发布一些样本数据和预期结果。样本中的最佳输出不仅仅包括object_id=161。因此它与您的第一个查询不匹配。你可能想把这两个东西对齐。我也注意到了这一点,并解决了它。另一个问题-在表定义中,您有投票-布尔,然后投票=1,2,3。。。例如,谢谢@IgorRomanchenko;当我发布问题时,该列是布尔值。我将其更改为整数,因为我决定使用NULL缓存投票,因为有意识的投票弃权会使缓存层认为没有投票。请发布一些示例数据和预期结果。样本中的最佳输出不仅仅包括object_id=161。因此它与您的第一个查询不匹配。你可能想把这两个东西对齐。我也注意到了这一点,并解决了它。另一个问题-在表定义中,您有投票-布尔,然后投票=1,2,3。。。例如,谢谢@IgorRomanchenko;当我发布问题时,该列是布尔值。我把它改成了一个整数,因为我决定使用NULL来缓存投票,因为有意识的投票弃权会让缓存层认为没有投票。谢谢。您帮助我找到了我想要的内容-选择投票,从用户帐户id上的SELECT DISTINCT计算投票,对象id投票,创建的时间戳,用户帐户id,对象id FROM id,其中对象id=?ORDER BY useraccount_id、object_id、timestamp_创建的描述为sq1 GROUP BY vote;。。。而像你这样的疑问正是我首先想要的。将所有内容都放在一行中更易于扩展。多谢!谢谢您帮助我找到了我想要的内容-选择投票,从用户帐户id上的SELECT DISTINCT计算投票,对象id投票,创建的时间戳,用户帐户id,对象id FROM id,其中对象id=?ORDER BY useraccount_id、object_id、timestamp_创建的描述为sq1 GROUP BY vote;。。。而像你这样的疑问正是我首先想要的。将所有内容都放在一行中更易于扩展。多谢!谢谢当我有时间的时候,我会查看分区和窗口。我不知道如何使这个查询适应我的确切需求,但它看起来是一个更好的方法。谢谢。当我有时间的时候,我会查看分区和窗口。我不知道如何使这个查询适应我的确切需求,但它看起来是一个更好的方法。
SELECT SUM (CASE WHEN vote THEN 1 ELSE 0 END) as true_vote_sum,
SUM (CASE WHEN vote THEN 0 ELSE 1 END) as false_vote_sum
FROM (SELECT DISTINCT ON (useraccount_id, object_id)
vote
FROM votes
WHERE object_id = 161 -- your filter here
ORDER BY useraccount_id, object_id, timestamp_vote DESC)