0

私はこれを20分間見つめていましたが、頭を包むことはできません. 以前にやったことがありますが、どのプロジェクトで覚えていないだけなので (コードを参照できます)。

私はそのようなテーブルを持っています:

votes [table]
  id - serial , primary
  useraccount_id - id
  object_id - id
  vote - int
  timestamp_vote - timestamp

任意の 1 つのオブジェクトに対する現在の投票総数を選択できる必要があります。

ただし、このテーブルは「タイムライン」ビューとしても機能します。id 列としてシーケンスを使用していることに注意してください。useraccount_id + object_id の複数のレコードがある場合があります

残念ながら、これは私が必要とするものではありません:

SELECT 
   vote , count(vote)
FROM 
   votes
WHERE
   object_id = 161 
GROUP BY 
   vote ;

特定のユーザーによる最新の投票に制限するには、サブクエリと個別、および「タイムスタンプの順序による順序」を使用する必要があることを知っています。その SELECT をつなぎ合わせる方法を思い出せません。

-- サンプルデータの追加 --

サンプルデータ

 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`
4

2 に答える 2

2
select vote, 
       count(vote) as cnt
from (
   select vote, 
          row_number() over (partition by vote order by timestamp_created desc) as rn
   from votes
)
where rn = 1
group by vote;
于 2012-12-11T19:59:20.373 に答える
1

あなたはそのようなことを試すことができます:

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

すべての の最後の投票を行います(useraccount_id, object_id)

それで:

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)

投票数を取得します。

詳細: DISTINCT ONCASE WHEN

于 2012-12-11T20:05:52.540 に答える