Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql-选择“投票”计数,但仅包括最新的_Postgresql - Fatal编程技术网

Postgresql-选择“投票”计数,但仅包括最新的

Postgresql-选择“投票”计数,但仅包括最新的,postgresql,Postgresql,我已经盯着这个看了20分钟了,都没法想清楚。我以前做过,只是不记得在哪个项目中,所以我可以引用代码 我有一张这样的桌子: votes [table] id - serial , primary useraccount_id - id object_id - id vote - int timestamp_vote - timestamp 我需要能够选择任何一个对象的当前投票总数 但是,此表也充当“时间线”视图。请注意,我使用的是一个序列作为id列。useraccount\u

我已经盯着这个看了20分钟了,都没法想清楚。我以前做过,只是不记得在哪个项目中,所以我可以引用代码

我有一张这样的桌子:

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)