
以下の内容のテーブルで
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`created` datetime NOT NULL DEFAULT current_timestamp(),
`win_or_lose` enum('win','lose')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (1, '2023-05-23 00:00:00', 'lose');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (2, '2023-05-23 00:01:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (3, '2023-05-23 00:02:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (4, '2023-05-23 01:00:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (5, '2023-05-23 02:00:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (6, '2023-05-23 02:01:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (7, '2023-05-23 02:02:00', 'lose');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (8, '2023-05-23 02:03:00', 'lose');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (9, '2023-05-23 04:00:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (10, '2023-05-23 04:01:00', 'lose');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (11, '2023-05-23 04:02:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (12, '2023-05-23 05:00:00', 'lose');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (13, '2023-05-23 05:01:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (14, '2023-05-23 06:01:00', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (15, '2023-05-23 06:01:01', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (16, '2023-05-23 06:01:02', 'win');
INSERT INTO `test` (`id`, `created`, `win_or_lose`) VALUES (17, '2023-05-23 07:01:02', 'win');
1時間ごとの勝率(winの行数 ÷(winの行数+loseの行数))が60%以上でかつ3行以上の場合のみ、
次の時間帯の勝率の合計を求めるSQL文を教えてください。
この場合だと、
0時台 win2行、lose1行 合計3行 勝率60%以上 (この時間帯の勝率は含めない、しかし条件にマッチしたので次の時間帯の勝率を含める)
1時台 win1行、lose0行 合計1行 勝率60%以上 (この時間帯の勝率は含める、しかし条件にマッチしなかったので次の時間帯の勝率は含めない)
2時台 win2行、lose2行 合計4行 勝率60%未満 (この時間帯の勝率は含めない、そして条件にマッチしなかったので次の時間帯の勝率は含めない)
3時台 win0行、lose0行 合計0行 勝率60%未満 (この時間帯の勝率は含めない、そして条件にマッチしなかったので次の時間帯の勝率は含めない)
4時台 win2行、lose1行 合計3行 勝率60%以上 (この時間帯の勝率は含めない、しかし条件にマッチしたので次の時間帯の勝率を含める)
5時台 win1行、lose1行 合計2行 勝率60%未満 (この時間帯の勝率は含める、しかし条件にマッチしなかったので次の時間帯の勝率は含めない)
6時台 win3行、lose0行 合計3行 勝率60%以上 (この時間帯の勝率は含めない、しかし条件にマッチしたので次の時間帯の勝率を含める)
7時台 win1行、lose0行 合計1行 勝率60%以上 (この時間帯の勝率は含める、しかし条件にマッチしなかったので次の時間帯の勝率は含めない)
そして得たい結果は、
win1行(1時台) + win1行(5時台) + win1行(7時台) = win3行
lose0行(1時台) + lose1行(5時台)+ lose0行(7時台) = lose1行
win3行 ÷ (win3行 + lose1行) = 0.75(←これ)
になります。
例えば、
SELECT DATE_FORMAT(created, '%Y-%m-%d %H:00:00') AS hour,
COUNT(CASE WHEN win_or_lose = 'win' THEN 1 END) AS wins,
COUNT(CASE WHEN win_or_lose = 'lose' THEN 1 END) AS losses
FROM test
GROUP BY hour
HAVING wins + losses >= 3 AND wins / (wins + losses) >= 0.6
ORDER BY hour;
で1時間ごとの勝率(winの行数 ÷(winの行数+loseの行数))が60%以上でかつ3行以上の取得はできたのですが、
ここからこの結果をどのように利用すれば良いのかが分からないです。
No.1ベストアンサー
- 回答日時:
まず集計用に生成列を設定するのがベターです。
create table tbl (
`id` int primary key,
`created` datetime not null default current_timestamp(),
`win_or_lose` enum('win','lose'),
`d` datetime as (concat(year(created),'-',month(created),'-',day(created),' ',hour(created),':00:00'))
);
insert into tbl (id,created,win_or_lose) values
( 1,'2023-05-23 00:00:00','lose'),
( 2,'2023-05-23 00:01:00','win'),
( 3,'2023-05-23 00:02:00','win'),
( 4,'2023-05-23 01:00:00','win'),
( 5,'2023-05-23 02:00:00','win'),
( 6,'2023-05-23 02:01:00','win'),
( 7,'2023-05-23 02:02:00','lose'),
( 8,'2023-05-23 02:03:00','lose'),
( 9,'2023-05-23 04:00:00','win'),
(10,'2023-05-23 04:01:00','lose'),
(11,'2023-05-23 04:02:00','win'),
(12,'2023-05-23 05:00:00','lose'),
(13,'2023-05-23 05:01:00','win'),
(14,'2023-05-23 06:01:00','win'),
(15,'2023-05-23 06:01:01','win'),
(16,'2023-05-23 06:01:02','win'),
(17,'2023-05-23 07:01:02','win');
あとはd列を使って集計します。
select sum(win_or_lose='win')/count(*) as ratio from tbl
where d in(
select d+interval 1 hour
from tbl
group by d
having count(*)>=3
and sum(win_or_lose='win')/count(*)>=.6
)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ゲーム) 勝ったときはYOU WIN PERFECTと言ってますが負けたときはYOU LOSE PERFECT 4 2022/12/04 15:16
- PHP php エラー 2 2022/10/23 16:43
- Ruby vscode 文字化け 1 2022/05/21 19:17
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- 英語 提示した名言の解釈等について 9 2022/04/21 09:23
- 中古車 ビッグモーターと保険会社がwin-winな関係だったから。 不正請求がなんなり済んだ…て話もあります 6 2023/07/25 16:06
- 経済 アメリカ経済は需要と供給が最高なのに コロナ後のロシアウクライナ戦争で物価高騰。 これじやヤバいと金 4 2023/04/02 13:09
- リフォーム・リノベーション リフォーム業界は これから上昇業界だとは、思いますが。 営業会社が 増えるのは職人には、有難いが。 5 2022/05/09 19:27
- モニター・ディスプレイ Win11マルチディスプレイでの異なる仮想デスクトップの表示 3 2023/02/01 10:02
- Mac OS Parallels Desktop for Mac 2 2023/06/22 04:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラーをいくらチェックしてもD...
-
集計でテストの各教科の最高得...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
Accessの構成をコピーしたい
-
SQLで、Join句で結合したテ...
-
テーブル名が可変の場合のクエ...
-
CASEでBETWEEN制約
-
timestampのデータはどのように...
-
Access2010のVBAで異体字の記述
-
PRIMARY KEYのコピー
-
SQLSERVER 連番更新について
-
複数の条件に該当する結果を、...
-
クエリ式でDcount の代わりは?
-
水平分割されたテーブルに対す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
固定長のデータをmysqlで取り込...
-
文字列を追加してUPDATEしたい
-
集計でテストの各教科の最高得...
-
Using temporary; Using fileso...
-
次の時間帯の勝率の合計を求め...
-
エラーをいくらチェックしてもD...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
PostgreSQLのtimestamp型で時間...
-
エラーを起こす方法
-
既存データをINSERT文にして出...
-
オラクルのUPDATEで複数テーブル
-
SQLで、Join句で結合したテ...
-
timestampのデータはどのように...
-
selectの単純繰り返し
おすすめ情報