30日間ビジターバッジ

ユーザーが連続して10日または365日間フォーラムを訪れた場合に付与されるバッジが存在することは知っていますが、私のフォーラムでは30日連続で訪問したユーザーに自動的に付与されるバッジを作成したいと考えています。

何よりもまず、SQLを取得したいと考えています。

参考までに、既存のクエリはデータエクスプローラーで見つけることができます。

例:SELECT * from badges WHERE query LIKE '%10 days%'

365 日用のクエリは以下の通りです:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 365 ) SELECT user_id , "start" + interval '365 days' "granted_at" FROM visits WHERE "rank" = 1

10 日用は:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 10 ) SELECT user_id , "start" + interval '10 days' "granted_at" FROM visits WHERE "rank" = 1

なので、30 日用もこれでうまくいくかもしれません:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 30 ) SELECT user_id , "start" + interval '30 days' "granted_at" FROM visits WHERE "rank" = 1

… 実際に実行して確認しましたが、一見妥当な結果が返ってくるようです。ただし、結果を詳細に検証したわけではありません :sweat_smile:

どうもありがとうございます。感謝しています。

@merefield

コードをコピーしようとしているのですが、ブロックされているようです。再度ありがとうございます。:heart:

お困りですか?どういう意味でしょうか?(私のスペイン語が下手で申し訳ありません)確認しましたが、正常に動作しています。必須項目をすべて入力し、上部にバリデーションエラーがないかご確認ください。保存が成功すれば、左側のリストの下部に新しいバッジが表示されます。また、SQL の下にあるリンクを使用して結果をプレビューすることもできます。

フォーラムで、10 日間に関するバッジの SQL をコピーし、30 日に変更しようとしていましたが、コピーできませんでした。しかし、あなたの助けのおかげで、私が望んでいたバッジを作成することができました。