
SQL Server 2008 にて下記条件を満たしたデータの取得を行いたいです。
・IDごとに、日付がある日以前で最新のものとその次の日付のデータ2件
・ただし、その2件で価格が変わらなければ価格変動のあった日付のデータまでさかのぼる
・価格が同じデータの場合、古い日付のデータを取得
例:
・条件…日付が20040101以前
<検索対象データ>
ID 日付 価格
------------------------
1 20000101 100
1 20010201 100
1 20020301 200
2 20020401 300
2 20000501 400
2 20010601 400
2 20030701 300
3 20000801 500
3 20010901 600
3 20040901 600
<取得したい結果>
ID 日付 価格
------------------------
1 20020301 200
1 20000101 100
2 20020401 300
2 20000501 400
3 20010901 600
3 20000801 500
なるべく少ないSelect文で取得したいと考えております。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
with T as ( select t1.*
from ( select 検索対象データ.*,
dense_rank() over( partition by ID order by 価格 ) rnk
from 検索対象データ ) t1
where t1.rnk <= 2 )
select T.ID, T.日付, T.価格 from T
where not exists
( select 1 from T T2
where T.ID=T2.ID
and T.価格=T2.価格
and T.日付>T2.日付 )
order by T.ID, T.日付 desc
No.1
- 回答日時:
SQL Serverの環境がないので動作確認できていませんが。
with 共通テーブル as(
select id,日付,価格,row_number() over(partition by id order by 日付 desc) rn
from テーブル
)
select id,日付,価格
from (
select id,日付,価格,価格変動,count(価格変動) over(partition by id order by 日付 desc) 変動回数
from (
select id,日付,価格
,case when
coalesce(
(select 価格 from 共通テーブル tmp
where tmp.id = t1.id
and tmp.rn = t1.rn + 1)
,価格+1) != 価格
then 1
else null
end 価格変動
from 共通テーブル t1
) t2
)
where 変動回数 <= 2
and 価格変動 = 1
order by id,日付 desc;
全角スペースでインデントしているので、実行時には置き換えるか削除してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- JavaScript gasについて 1 2022/05/31 21:51
- ドライブ・ストレージ 古い外付けHDDから新品外付けHDDへのデータ移行方法 (Mac) 2 2022/12/11 02:01
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- その他(Microsoft Office) wordの差し込み印刷での日付表示 2 2023/08/15 16:51
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のテーブルから値を合計出...
-
SQLで、同じ値が何回連続す...
-
MySQLで特定のグループの上位3...
-
<SQL>重複しているデータの場合...
-
下記の問合せを行うクエリを、 ...
-
DISTINCTROWについてです。
-
Oracleで「文字が無効です」の...
-
SQLローダーCSV取込で、囲み文...
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
-
SELECT FOR UPDATE で該当レコ...
-
テーブルの最後(最新)のレコー...
-
int型フィールドにnullを登録で...
-
where句中のtrim関数について
-
count関数の値をwhere句で使用...
-
「数字で始まらない」ものを抽...
-
BLOBやCLOBのパフォーマンスを...
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
時間帯テーブルから直近空き時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
MySQLのdatetime型に0月0日を格納
-
最新の日付と2番目の日付のデー...
-
mysqlでクロス集計を取りたいが...
-
サブクエリを使わない方法
-
Mysqlで最新の日付を持つデータ...
-
SQLで、同じ値が何回連続す...
-
SQL 重複しないJoinの仕方を教...
-
型変換
-
MySQLで特定のグループの上位3...
-
日付検索で0001-01-01 00:00:00...
-
SQLです。下記の問合せを行うク...
-
直近1ヶ月に誕生日を迎える社員...
-
ここで「interval」は どんな働...
-
先期末日の日付を求めるSQL
-
mysqlのif文かcase文で複数条件...
-
MySQLで日付(date)型のdefaul...
-
日付のフォーマット
-
「8月の第3土日」をデータベ...
おすすめ情報