2

"latest" 順 ("id desc" または "created_at desc" のいずれか) で並べ替えられた、個別の user_id を持つ最新のアクティビティを取得しようとしています。

SELECT DISTINCT ON (id, user_id) id,user_id 
FROM "activities" 
GROUP BY id,user_id 
ORDER BY id desc LIMIT 10

ただし、次の user_id を持つ 10 件の結果が返されます。

2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2615

明らかに、区別されていません。個別の (グループ化された) user_id を持つようにするにはどうすればよいですか?

編集: 説明が不十分だったかもしれません。申し訳ありません。簡単に言えば、一意の user_id から最新のアクティビティを取得したいのです。最新では、created_at による方法を好みますが、id による方法も同様に機能します。そして、ユーザーごとに1つだけ、重複はありません。

もう一度編集します。みんなをそこから放り出してごめんなさい、私が欲しいのは本当にとてもシンプルです:/。

4

4 に答える 4

1

関係のある最新の活動がある場合、例えば

user_id created_at      id
john    july 4, 2010    1
john    july 4, 2010    2
john    july 12, 2010   3        -- ties with id# 4
john    july 12, 2010   4        -- ties with id# 3
john    july 5, 2010    5
paul    july 13, 2010   6
paul    july 12, 2010   7

density_rankを使用します:

with latest_activities as
(
    SELECT user_id, created_at, id,
        dense_rank() 
        over(partition by user_id order by created_at desc) as the_ranking
    FROM activities     
)
select * 
from latest_activities
where the_ranking = 1
order by user_id, id;

上記のクエリは次のように表示されます。

user_id created_at      id 
john    july 12, 2010   3
john    july 12, 2010   4
paul    july 13, 2010   6

ユーザーごとに複数のIDを1行にのみ表示する場合は、group_concat array_aggを使用すると、次のように表示されます。

user_id created_at      ids
john    july 12, 2010   3, 4
paul    july 13, 2010   6

array_agg:

with latest_activities as
(
    SELECT user_id, created_at, id,
        dense_rank() 
        over(partition by user_id order by created_at desc) as the_ranking
    FROM activities     
)
select user_id, created_at, array_agg(id order by id) as ids
from latest_activities
where the_ranking = 1
group by user_id, created_at

上記のクエリは、関連性のないデータでも機能していることに注意してください

ライブテスト:http ://www.sqlfiddle.com/#!12 / c48ec / 8

于 2012-12-25T00:35:32.247 に答える
1

RE: 一意の user_id の最新のアクティビティが必要です

SELECT DISTINCT ON (user_id) user_id, created_at
FROM "activities" 
ORDER BY user_id, created_at desc

RE: どうすれば ID を取得できますか? まだIDが必要です

上記のクエリを再利用します。

with latest_activities as
(
  SELECT DISTINCT ON (user_id) user_id, created_at
  FROM "activities" 
  ORDER BY user_id, created_at desc
)
select l.user_id, l.created_at, array_agg(a.id) as ids
from latest_activities l
join activities a using(user_id)
group by l.user_id, l.created_at
于 2012-12-25T00:16:50.260 に答える
1

これを試して:

select user_id, array_agg(id) as ids
from activities
group by user_id
having count(*) > 1;

このarray_agg()関数は、グループのすべての値をカンマ区切りのリストとして返します。

編集:

コメントから、これが欲しいだけのようです:

select distinct user_id
from activities;

または、重複しているユーザー ID のみを表示する次のようにすることもできます。

select user_id
from activities
group by user_id
having count(*) > 1;
于 2012-12-24T02:56:51.293 に答える
1

あなたが何を望んでいるのか正確にはわかりませんが、これを試してください:

SELECT id, user_id
FROM (
   SELECT id
        , user_id
        , ROW_NUMBER () OVER (PARTITION BY id
                              ORDER BY user_id DESC) as rn
   FROM "activities"
   ) as xx
WHERE rn = 1
ORDER BY id desc 
LIMIT 10

OLAP 関数は、のROW_NUMBER値内でカウンターを割り当てますid

于 2012-12-24T03:23:59.077 に答える