Mysqlレコード集計について
以下のようなテーブルがあります。
勝った試合は[win]に1が入っています。
|seq| date |win|
| 1|2010/04/01| 1|
| 2|2010/04/02| 0|
| 3|2010/04/03| 1|
| 4|2010/04/04| 1|
| 5|2010/04/05| 1|
[date] ASC
3連勝以上した回数をsqlで集計したいです。
sqlをいろいろ調べてみましたが、わかりませんでした。
わかる方いらっしゃれば教えてください。
よろしくお願いいたします。
No.2
- 回答日時:
下記の様に仮定して、考えました。
・win には必ず0(負け)か1(勝ち)の値が入っている
・Dateは重複が無い
---------------------------------------------------------
SELECT COUNT(*) FROM t_game a
WHERE
(
win = 0 AND
(
SELECT COUNT(*) FROM t_game b
WHERE b.win = 1 AND a.date < b.date AND
NOT EXISTS (
SELECT 1 FROM t_game c WHERE c.win = 0 AND a.date < c.date AND c.date < b.date
)
) >= 3
) OR (
win = 1 AND
NOT EXISTS (SELECT 1 FROM t_game d WHERE d.date < a.date) AND
(
SELECT COUNT(*) FROM t_game e
WHERE e.win = 1 AND a.date < e.date AND
NOT EXISTS (
SELECT 1 FROM t_game f WHERE f.win = 0 AND a.date < f.date AND f.date < e.date
)
) >= 2
)
;
---------------------------------------------------------
MySQLでは試してませんが、ver 5.1 では動作すると思います。
考え方としては下記の条件に当てはまるものを合計しました。
・winが0で、次のwinが0の行との間に在る行の数が3以上の行
・先頭行で、winが1で、次のwinが0の行との間に在る行の数が2以上の行
参考URL:http://codezine.jp/article/detail/1076?p=2
この回答への補足
root139様ありがとうございます
回答ありがとうございました。
お蔭様で本来望んでいる通りの結果を出す事が出来ました。
もうひとつ御教授いただけると幸いです。
|seq|player_id| date |win|
| 1| 1|2010/04/01| 0|
| 2| 1|2010/04/02| 1|
| 3| 1|2010/04/03| 1|
| 4| 1|2010/04/04| 1|
| 5| 1|2010/04/05| 1|
| 6| 1|2010/04/06| 1|
| 7| 1|2010/04/07| 1|
| 8| 2|2010/04/01| 1|
| 9| 2|2010/04/02| 1|
| 10| 2|2010/04/03| 1|
[player_id]=勝利投手
3連勝毎にボーナスポイント1を与えたいと考えております。
(5連勝1ポイント・6連勝2ポイント・7連勝2ポイント)
sqlで可能でしょうか?
以下のような形で出力できればと考えております。
|player_id|point|
| 1| 2|
| 2| 1|
よろしくお願いいたします。
root139様ありがとうございます
回答ありがとうございました。
お蔭様で本来望んでいる通りの結果を出す事が出来ました。
もうひとつ御教授いただけると幸いです。
|seq|player_id| date |win|
| 1| 1|2010/04/01| 0|
| 2| 1|2010/04/02| 1|
| 3| 1|2010/04/03| 1|
| 4| 1|2010/04/04| 1|
| 5| 1|2010/04/05| 1|
| 6| 1|2010/04/06| 1|
| 7| 1|2010/04/07| 1|
| 8| 2|2010/04/01| 1|
| 9| 2|2010/04/02| 1|
| 10| 2|2010/04/03| 1|
[player_id]=勝利投手
3連勝毎にボーナスポイント1を与えたいと考えております。
(5連勝1ポイント・6連勝2ポイント・7連勝2ポイント)
sqlで可能でしょうか?
以下のような形で出力できればと考えております。
|player_id|point|
| 1| 2|
| 2| 1|
よろしくお願いいたします。
No.3
- 回答日時:
こんな感じでいけませんか?
ちなみにテーブル名=hoge、dateは予約語なのでdとしました
SELECT count(*) from(
SELECT
coalesce((
SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win
) ,d - interval 1 day)AS pre
,win,count(*) as c
FROM hoge AS h1
group by pre,win) as sub
where win=1 and c>=3
yambejp様ありがとうございます
これだけ短いSQLで実現可能だとは・・・
ただ私には、SQL文が理解できませんでした・・・
ありがとうございました
No.4
- 回答日時:
>SQL文が理解できませんでした・・・
すみません。はしょりすぎましたね。
くわえて、バグがありましたのでついでになおします。
以下のように段階を分けて組んでいけばよいでしょう。
(1)まず、自分より以前でwinが自分以外のものの最大値をえます。
SELECT(
SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win
)AS pre
,win
FROM hoge AS h1
こうすると連勝、連敗中の直前データがpreに表示されます。
(2)preとwinの組み合わせで連勝連敗記録を拾います。
SELECT
(
SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win
) AS pre
,win,count(*) as c
FROM hoge AS h1
group by pre,win
(3)これに条件を設定(3連勝以上=winが1でcが3以上)してカウントすればよいでしょう。
SELECT count(*) FROM(
SELECT
(
SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win
)AS pre
,win,count(*) as c
FROM hoge AS h1
group by pre,win
) AS sub
WHERE win=1 AND c>=3
yambejp様ありがとうございます。
補足までつけていただきありがとうございました。
もうひとつ御教授いただけると幸いです。
|seq|player_id| date |win|
| 1| 1|2010/04/01| 0|
| 2| 1|2010/04/02| 1|
| 3| 1|2010/04/03| 1|
| 4| 1|2010/04/04| 1|
| 5| 1|2010/04/05| 1|
| 6| 1|2010/04/06| 1|
| 7| 1|2010/04/07| 1|
| 8| 2|2010/04/01| 1|
| 9| 2|2010/04/02| 1|
| 10| 2|2010/04/03| 1|
[player_id]=勝利投手
3連勝毎にボーナスポイント1を与えたいと考えております。
(5連勝1ポイント・6連勝2ポイント・7連勝2ポイント)
sqlで可能でしょうか?
以下のような形で出力できればと考えております。
|player_id|point|
| 1| 2|
| 2| 1|
よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
前回とほぼロジックは同じです。
SELECT player_id,sum(truncate(c/3,0)) as point from
(
SELECT(
SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win and h1.player_id=player_id
)AS pre
,win,player_id,count(*) as c
FROM hoge AS h1
GROUP BY pre,win,player_id
) as sub
where win=1
group by player_id
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
エクセルで最後の文字だけ置き...
-
阪急三番街 ATM(ゆうちょ)は...
-
同一のユーザー、同一商品のと...
-
Unionした最後にGROUP BYを追加...
-
DataTableで重複行を削除したい
-
書籍の内容はまともでしょうか?
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
WHERE id = ? について
-
min句のSQLを改造し二番目に小...
-
MySQLのint型で001と表示する方...
-
別テーブルからSELECTした値を...
-
所有格の意味
-
select文のwhere句に配列を入れ...
-
スクリーンセイバー
-
MySQLの抽出について
-
ポスグレでの幾何学データ配列...
-
AUTO_INCREMENTのあるテーブル...
-
【MySQL】本当に困っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報