
最近の連続失敗回数が3回の登録番号を求めるクエリがわかりません。
教えてください。
DBは、MySQL version: 4.0.22で、副問合せ等は使用できません。
create table t_test(
n_no integer,-- 登録番号
n_flg integer,-- 0:成功1:失敗
d_update date-- 更新日付
);
insert into t_test (n_no, n_flg, d_update)values (1,0,'2007-06-01');
insert into t_test (n_no, n_flg, d_update)values (1,0,'2007-06-02');
insert into t_test (n_no, n_flg, d_update)values (1,0,'2007-06-03');
insert into t_test (n_no, n_flg, d_update)values (1,1,'2007-06-04');
insert into t_test (n_no, n_flg, d_update)values (1,1,'2007-06-05');
insert into t_test (n_no, n_flg, d_update)values (2,0,'2007-06-01');
insert into t_test (n_no, n_flg, d_update)values (2,0,'2007-06-02');
insert into t_test (n_no, n_flg, d_update)values (2,1,'2007-06-03');
insert into t_test (n_no, n_flg, d_update)values (2,1,'2007-06-04');
insert into t_test (n_no, n_flg, d_update)values (2,1,'2007-06-05');
insert into t_test (n_no, n_flg, d_update)values (3,0,'2007-06-03');
insert into t_test (n_no, n_flg, d_update)values (3,1,'2007-06-04');
insert into t_test (n_no, n_flg, d_update)values (3,1,'2007-06-05');
insert into t_test (n_no, n_flg, d_update)values (3,1,'2007-06-06');
insert into t_test (n_no, n_flg, d_update)values (3,0,'2007-06-07');
No.2ベストアンサー
- 回答日時:
4回以上を除くのであれば、最近から過去4更新のデータをとって、
ビットをたてて計算するのかなぁ・・・
ぱっと思いついたものなので効率的かどうかはわかりません。
SET @RANK=0,@NO=NULL;
CREATE TEMPORARY TABLE `temp_t_test`
SELECT n_no,n_flg, d_update,if(@NO=`n_no`,@RANK:=@RANK+1,@RANK:=1) AS `RANK`,@NO:=n_no AS `NO`
FROM `t_test`
ORDER BY `n_no` ASC,`d_update` DESC;
SELECT `n_no` ,SUM(`n_flg`*POW(2,`RANK`-1)) AS `FLG`
FROM `temp_t_test`
WHERE 1
AND `RANK` <=4
AND `n_flg`=1
GROUP BY `n_no`
HAVING `FLG`=7;
No.1
- 回答日時:
>最近の連続失敗回数が3回
の仕様提言があいまいです。
「ここ3回の更新の際、連続3回失敗しているもの」なのでしょうか?
「最新では失敗していても成功していてもかまわないが、もっとも近い失敗をみたとき
その前回、前々回が失敗しているもの」なのでしょうか?
前者ならば日付を3つとりだせばすむのですが、後者だと、失敗した更新日まで
さかのぼらなくてはなりません。
また、3回なのか3回以上なのでしょうか?
3回はいいけど4回はだめなら4回のものを除外する処理が必要です。
さらに深読みすれば「連続失敗回数が3回」ということなら、連続して失敗していない
失敗はカウントせず、2回以上失敗した場合の連続回数が3回・・・なんてふうにも
よめます。
質問者さんがなにをもとめているわからないですが、とりあえず何もしないのも
なんなんで変数とテンポラリを使ってやってみました。
うごくとはおもいますが、精査していないので効率的ではないとおもいます。
SET @RANK=0,@NO=NULL;
CREATE TEMPORARY TABLE `temp_t_test`
SELECT n_no,n_flg, d_update,if(@NO=`n_no`,@RANK:=@RANK+1,@RANK:=1) AS `RANK`,@NO:=n_no AS `NO`
FROM `t_test`
ORDER BY `n_no` ASC,`d_update` DESC;
SELECT `n_no` ,COUNT(*) AS `COUNT`
FROM `temp_t_test`
WHERE `RANK`<=3
AND `n_flg`=1
GROUP BY `n_no`
HAVING `COUNT` =3;
この回答への補足
早速のご回答どうもありがとうございます。
おっしゃるとおり仕様提言が甘くなりまして申し訳ございません。
yambejp様のおっしゃる下記の点が不足していました。
その点を含めた場合、どうすればいいのでしょうか・・。
>ここ3回の更新の際、連続3回失敗しているもの
>3回はいいけど4回はだめなら4回のものを除外する
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
'modify' 付近に不適切な構文が...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
SQLで、Join句で結合したテ...
-
テーブル定義書(Oracle) 【IX】...
-
データベース ユーザの「このユ...
-
既存データをINSERT文にして出...
-
truncate tableを使って複数の...
-
SQLサーバに対するSQL文で抽出...
-
サブクエリーを使わずに二つの...
-
PostgreSQLのtimestamp型で時間...
-
UPDATEで既存のレコードに文字...
-
select文の結果から新しいテー...
-
【SQL】項目に紐づいている情報...
-
(SQL)かな・カナデータの並べ...
-
SELECTした結果に行番号を求めたい
-
csvデータ不要列の削除をbatフ...
-
集計でテストの各教科の最高得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
'modify' 付近に不適切な構文が...
-
データ内の「\\」や「'」を抽出...
-
sqlによるデータの変更
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
PostgreSQLのtimestamp型で時間...
-
エラーを起こす方法
-
既存データをINSERT文にして出...
-
オラクルのUPDATEで複数テーブル
-
SQLで、Join句で結合したテ...
-
timestampのデータはどのように...
-
selectの単純繰り返し
-
Accessの構成をコピーしたい
-
pandasでsqlite3にテーブル作成...
-
CSVファイルを読み込んでテーブ...
-
SELECTした結果に行番号を求めたい
おすすめ情報