以下のテーブルの様に時系列が抜けているテーブルから直近2年度連続で減少していない年度を
抽出しようとしています。
/*
year|sale
---------
1990|50
1992|50
1993|52
1994|55
1997|55
*/
/*
CREATE TABLE sales2
(year INTEGER NOT NULL ,
sale INTEGER NOT NULL ,
PRIMARY KEY (year));
INSERT INTO sales2 VALUES (1990, 50);
INSERT INTO sales2 VALUES (1992, 50);
INSERT INTO sales2 VALUES (1993, 52);
INSERT INTO sales2 VALUES (1994, 55);
INSERT INTO sales2 VALUES (1997, 55);
*/
以下の記述で直近の年度までなら表示できているとは思うのですが2年連続となると
やり方が思いつきません。誰かご教授いただけないでしょうか?
select
year,sale
from
sales2 s1
where
sale >=(select sale from sales2 s2 where s2.year =
(select max(year) from sales2 s3 where s1.year > s3.year))
order by
year
;
No.1ベストアンサー
- 回答日時:
>時系列が抜けている
抜けている年度の値はどうするのでしょう?
例:
1993 56
1994 55
1995 ?(抜け)
1996 ?(抜け)
1997 53
1997は2年連続減少?
2年連続減少とは限りませんが。
(抜けが0だと考えると、2年連続減少ではない。データのある年度でいうと2年連続減少である。)
というのを気にしないで、単にあるレコードのみで判定するのなら、
前々のレコードを調べたいなら、
(select max(year) from sales2 s3 where s1.year > s3.year))
で求めたmax(year)より小さいmax(year)を求めれば出てくるわけですから、
select
year,sale
from
sales2 s1
where
sale >=(select sale from sales2 s2 where s2.year =
(select max(year) from sales2 s3 where s1.year > s3.year))
or
sale >=(select sale from sales2 s2 where s2.year =
(select max(year) from sales2 s3 where
(select max(year) from sales2 s4 where s1.year > s4.year)
> s3.year)
)
order by
year
;
で求まります。
(未検証ですが。)
ご回答ありがとうございます!
なるほど。こういう記述になるんですね。
理解するのに時間がかかってしまいましたが
望み通りの抽出ができました。
No.2
- 回答日時:
以前、連続2年上昇を考えたことがありますよね。
連続2年減少なら、簡単です。前回のSQLの不等号をひっくり返すだけ。
本当に問題の表現が正確であるのならば、
select sm.year, sm.sale
from sales sm
where not exists(
select sc.year, sc.sale
from sales sc join sales s1 on s1.year = sc.year -1
join sales s2 on s2.year = sc.year - 2
where s1.sale < s2.sale and sc.sale < s1.sale and sm.year=sc.year)
で、いけるともおいます。
サブクエリの中でやっていることは、2年連続で減少しているレコードの一覧の抽出です。前回のSQLと同じ方法ですね。
これをnot existsで否定しています。
さて、恒例の問題への条件です。
今回は、「減少していない」という表現だったので、前年度・前々年度が存在しない場合も含みます。実は、そのために、SQLが少々複雑な表現になっています。こうしないと、NULLの扱いが面倒なんです。存在しない年度との比較結果は、「減少していません」としています。増加もしていないし、同値でも無いんですけどね。
yearがきちんと一意であるか一意化できることが前提になるのは、前回の2年連続増加と同じです。
ご回答ありがとうございます。
色んな記述方法があるんですね~。
まだSQLを学び始めたばかりなので
サブクエリには苦戦しっぱなしです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つの列からの最大値取得
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
Accessで今日から5日後
-
エラーを起こす方法
-
テーブル定義書(Oracle) 【IX】...
-
既にテーブルが存在する場合の...
-
改行を含んだデータのインポート
-
オラクルのUPDATEで複数テーブル
-
T-SQLで任意の箇所で強制終了す...
-
同一テーブル内での比較(最新...
-
SQLで、Join句で結合したテ...
-
SELECTした結果に行番号を求めたい
-
Excel VBAのユーザーフォームで...
-
PostgreSQLのtimestamp型で時間...
-
MySQLで期間のUNIQUEってできま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
joinの場合のテーブル名の別名...
-
2つの列からの最大値取得
-
SQLについて
-
SQLのこと:distinctして並び替...
-
SQLで期間をずらした集計処理
-
SQLでのcount方法
-
Openldap関係でまた詰まってし...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
-
UPDATEで既存のレコードに文字...
-
オラクルのUPDATEで複数テーブル
-
SELECTした結果に行番号を求めたい
-
SQLで、Join句で結合したテ...
-
エラーを起こす方法
-
テーブル名が可変の場合のクエ...
おすすめ情報