以下の内容のテーブルで
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
集計でテストの各教科の最高得...
-
フラグをたてるってどういうこ...
-
UPDATEで既存のレコードに文字...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
-
オラクルのUPDATEで複数テーブル
-
右向き、左向きの速度が最大と...
-
SQLサーバに対するSQL文で抽出...
-
結合したテーブルをSUMしたい
-
ADO+ODBCでテーブルに接続する...
-
OracleとSQL ServerのSQL文上で...
-
sqlに記述できない文字
-
Accessの構成をコピーしたい
-
T-SQLで任意の箇所で強制終了す...
-
SQLのテーブルにないデータの出力
-
SQLで一定時間周期毎の抽出方法...
-
truncate tableを使って複数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
集計でテストの各教科の最高得...
-
固定長のデータをmysqlで取り込...
-
文字列を追加してUPDATEしたい
-
次の時間帯の勝率の合計を求め...
-
コマンドからDB名に"-"を使う...
-
エラーをいくらチェックしてもD...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
エラーを起こす方法
-
SELECTした結果に行番号を求めたい
-
timestampのデータはどのように...
-
SQLで、Join句で結合したテ...
おすすめ情報