あるユーザーの連続ログイン日数を求めるSQLクエリ
2022-01-05 18:39:05
I. タイトル説明
各ユーザーは、ユーザーログイン情報テーブルでプラットフォームにログインしている連続した日数を解く、要約日付に基づいてログインする必要があり、テーブル内の1日あたりの唯一のユーザーログイン(計算で関与日以内に重複していない)。
テーブルの説明:user_id:ユーザーのid。
sigin_date: ユーザーのログイン日。
II. ソリューションの分析
注:このプロセスを解決する方法はたくさんあります。以下の解決策は著者のアイデアであり、他の解決策はコメント欄で交換できます。
アイデア
この問題の突破口はログイン時間にあり、連続ログインIDを計算し、IDのグループ化をフィルターとして連続ログイン日数を取得し、最後にuser_idのグループ化を利用してcount()関数でユーザーごとに連続ログイン日数を集計します。
連続ログイン数 = (当日のログイン数 - ユーザーのログイン数) - 窓付きソート順 (逆順)
III. 解答プロセスと結果表示
1. データの準備
-- 1. Table creation statement
drop table if exists test_sigindate_cnt;
create table test_sigindate_cnt(
user_id string
sigin_date string
)
;
-- 2. Test data insert statement
insert overwrite table test_sigindate_cnt
select 'uid_1' as user_id,'2021-08-03' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-04' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-01' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-02' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-05' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-01' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-05' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-02' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_3' as user_id,'2021-08-04' as sigin_date
union all
select 'uid_3' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_4' as user_id,'2021-08-03' as sigin_date
union all
select 'uid_4' as user_id,'2021-08-02' as sigin_date
;
2. 計算の流れ
select user_id
,count(1) as sigin_cnt
from (
select
user_id
,datediff('2021-08-06',sigin_date) as data_diff
,row_number() over (partition by user_id order by sigin_date desc) as row_num
from test_sigindate_cnt
) t
where data_diff - row_num = -1
group by
user_id
;
3. 計算結果と期待値の比較
3.1 期待される結果
<テーブル 集計日 ユーザーID ログインした日数 2021-08-06 uid_1 6 2021-08-06 uid_2 2 2021-08-06 uid_3 13.2 計算結果
上記は、ユーザーの連続ログイン日数を調べるためのSQLクエリ文の詳細です、ユーザーの連続ログイン日数を調べるためのSQL文の詳細については、スクリプトの家の他の関連記事に注意を払うしてください
関連
-
SQL Server テーブルパーティション削除の詳細
-
SQL Server 2017がサーバーに接続できない問題解決
-
SQLServerクリーンアップログファイルのメソッド事例詳細
-
Filestreamの簡単な使い方まとめ
-
mybatis動的SQLの共通シナリオのまとめ
-
NavicatはSQL Serverのデータに接続します。エラー08001に対する完璧な解決策 - Named Pipeline Provider
-
SqlServerデータベースリモート接続ケースチュートリアル
-
SQL Server のジョブが失敗しました。所有者がサーバーアクセス権を持っているかどうか判断できない
-
SQL SERVERオープンCDC実践講座詳細
-
そのPHP環境の普遍的なパスワードのSQLインジェクションの脆弱性と防御手段
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLインジェクションとその防止、マイベイトの基本的な役割について
-
SQL SERVERのストアドプロシージャを使用した履歴データの移行について
-
SQL Server一括挿入データ事例詳細
-
SQLの書き方--行ごとの比較
-
リレーショナルデータベースと非リレーショナルデータベースの紹介
-
SQL文におけるJOINの利用シーンの分析
-
SQL Server のフィルタードインデックスによるクエリ文の改善に関するパフォーマンス分析
-
SQL SERVERのコミット・トランザクションのロールバック機構
-
SQLServerのエラーです。15404, unable to get information about Windows NT group/user WIN-8IVSNAQS8T7Administrator
-
データベース毎日練習問題、毎日少しづつ進歩(2)