[解決済み] 最小連続アクセス日数を決定するSQL?
2022-08-03 21:46:52
質問
次のユーザー履歴テーブルには あるユーザがWebサイトにアクセスした日ごとの記録 (24時間のUTC期間において) のレコードが含まれています。何千ものレコードがありますが、一人のユーザーにつき一日一レコードのみです。もしユーザーがその日にウェブサイトにアクセスしなかった場合、レコードは生成されません。
ID UserId CreationDate ------ ------ ------------ 750997 12 2009-07-07 18:42:20.723 750998 15 2009-07-07 18:42:20.927 751000 19 2009-07-07 18:42:22.283
私が求めているのは、このテーブルに対する SQL クエリです。 良いパフォーマンスで どのユーザー ID が (n) 連続で 1 日も欠かさずウェブサイトにアクセスしたかを教えてくれるものです。
言い換えれば 何人のユーザーがこのテーブルで連続した(前日または後日)日付の(n)レコードを持っているか。 ? もし、いずれかの日がシーケンスから欠落している場合、シーケンスは壊れており、1から再び開始する必要があります。私たちは、ここでギャップなしで連続した日数を達成したユーザーを探しています。
このクエリと 特定の Stack Overflow バッジ はもちろん単なる偶然です... :)
どのように解決するのですか?
答えは明らかです。
SELECT DISTINCT UserId
FROM UserHistory uh1
WHERE (
SELECT COUNT(*)
FROM UserHistory uh2
WHERE uh2.CreationDate
BETWEEN uh1.CreationDate AND DATEADD(d, @days, uh1.CreationDate)
) = @days OR UserId = 52551
EDITです。
さて、ここからは私の真面目な回答です。
DECLARE @days int
DECLARE @seconds bigint
SET @days = 30
SET @seconds = (@days * 24 * 60 * 60) - 1
SELECT DISTINCT UserId
FROM (
SELECT uh1.UserId, Count(uh1.Id) as Conseq
FROM UserHistory uh1
INNER JOIN UserHistory uh2 ON uh2.CreationDate
BETWEEN uh1.CreationDate AND
DATEADD(s, @seconds, DATEADD(dd, DATEDIFF(dd, 0, uh1.CreationDate), 0))
AND uh1.UserId = uh2.UserId
GROUP BY uh1.Id, uh1.UserId
) as Tbl
WHERE Conseq >= @days
EDITです。
[Jeff Atwood] これは素晴らしい高速なソリューションであり、受け入れられるに値しますが Rob Farley の解決策も素晴らしいものです。 であり、間違いなくさらに高速です(!)。こちらもぜひご覧ください。
関連
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] 2つの日付の差(日数)を計算する?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]