私のタイトルは少し紛らわしいかもしれませんが、ここにコンテキストがあります。
テーブル1があります。これには、SSIDへの接続ごとの参照コードと開始時刻の値が含まれています。ユーザーが今日接続し、2日後に切断するシナリオがあります。したがって、テーブルには、今日である開始時刻と今日から2日後の終了時刻を含む1つのレコードしかありません。
次に、1日あたりのユーザー接続のレポートを抽出します。この場合、1日あたりの参照コードでグループ化すると、3日間は1としてカウントされます。しかし、私はそれを1日あたり1として数えたいです。これを行うにはいくつかの方法がありますか?
@MrBrownstoneそのクエリの結果は
username starttime count(*)
445425760933 2019-02-05 1
445425760934 2019-02-05 1
445425760934 2019-02-06 1
これは私が探している結果ではありません。以下は私が必要とする結果です:
username starttime count(*)
445425760933 2019-02-05 1
445425760933 2019-02-06 1
445425760933 2019-02-07 1
445425760934 2019-02-05 1
445425760934 2019-02-06 1
コード445425760933は2019-02-07まで使用されたため
MySQL 8+の場合:
WITH RECURSIVE dates AS (
SELECT MIN(DATE(starttime)) `date`
FROM table1
UNION ALL
SELECT `date` + INTERVAL 1 DAY
FROM dates
WHERE `date` < ( SELECT MAX(DATE(endtime))
FROM table1 )
),
users AS (
SELECT DISTINCT username
FROM table1
)
SELECT /* DISTINCT */ users.username, dates.`date`, 1 `count(*)`
FROM users
JOIN dates
JOIN table1 ON table1.username = users.username
AND dates.`date` BETWEEN DATE(table1.starttime)
AND DATE(table1.endtime)
私があなたのニーズを正しく理解しているなら、DATE
関数を使用して日付だけでグループ化し、時間を無視することができます:
SELECT username, DATE(starttime) AS start_date, COUNT(*) as `count`
FROM my_table
GROUP BY username, DATE(starttime)
ORDER BY username, DATE(starttime);
日付と時刻の関数の詳細については、以下をご覧ください。
[〜#〜]編集[〜#〜]
提供された追加情報に基づいて、目的を達成するために日付のみを含む補助テーブルが必要になります。
CREATE TABLE `dates`
(
`Date` DATE NOT NULL PRIMARY KEY
);
SELECT DISTINCT username, `Date`, COUNT(*) as `count`
FROM my_table AS t
JOIN dates AS d
ON d.`Date` BETWEEN DATE(t.startime) AND DATE(t.endtime)
GROUP BY username, `Date`
ORDER BY username, `Date`;