web-dev-qa-db-ja.com

開始時刻と終了時刻を使用して、1日あたりの明確な値をカウントする方法

私のタイトルは少し紛らわしいかもしれませんが、ここにコンテキストがあります。

テーブル1があります。これには、SSIDへの接続ごとの参照コードと開始時刻の値が含まれています。ユーザーが今日接続し、2日後に切断するシナリオがあります。したがって、テーブルには、今日である開始時刻と今日から2日後の終了時刻を含む1つのレコードしかありません。

次に、1日あたりのユーザー接続のレポートを抽出します。この場合、1日あたりの参照コードでグループ化すると、3日間は1としてカウントされます。しかし、私はそれを1日あたり1として数えたいです。これを行うにはいくつかの方法がありますか?

the row marked as x is the one I am describing above.

@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まで使用されたため

2
Driggs Alonzo

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)
2
Akina

私があなたのニーズを正しく理解しているなら、DATE関数を使用して日付だけでグループ化し、時間を無視することができます:

SELECT username, DATE(starttime) AS start_date, COUNT(*) as `count`
  FROM my_table
GROUP BY username, DATE(starttime)
ORDER BY username, DATE(starttime);

日付と時刻の関数の詳細については、以下をご覧ください。

日付と時刻関数(MySQLリファレンス)

[〜#〜]編集[〜#〜]

提供された追加情報に基づいて、目的を達成するために日付のみを含む補助テーブルが必要になります。

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`;
1
Mr.Brownstone