
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
月ごとの集計について
-
日付検索で0001-01-01 00:00:00...
-
mysqlでunixtimeによる日付範囲...
-
SQLローダーCSV取込で、囲み文...
-
データ
-
検索結果を指定件数ずつ抽出表...
-
Oracleですがsqlで質問です。 ...
-
単一グループのグループ関数で...
-
SQL*Loader Append
-
SELECT FOR UPDATE で該当レコ...
-
OracleとAccessの出力順の違い
-
group byの並び順を変えるだけ...
-
Excelで作成した円グラフのデー...
-
MERGE INTO 処理について
-
count関数の値をwhere句で使用...
-
updateで複数行更新したい
-
phpmyadminでワイルドカードを...
-
AccessのSQL文で1件のみヒット...
-
大量レコードをTRUNCATEせずに...
-
ORDER BY の項目を SELECT する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
SQLで、同じ値が何回連続す...
-
最新の日付と2番目の日付のデー...
-
mysqlでunixtimeによる日付範囲...
-
【ExcelVBA】入力された日付か...
-
日付検索で0001-01-01 00:00:00...
-
DISTINCTROWについてです。
-
MySQLで特定のグループの上位3...
-
MySQLのdatetime型に0月0日を格納
-
MySQLで日付(date)型のdefaul...
-
下記の問合せを行うクエリを、 ...
-
SQLです教えてくださいお願いし...
-
「8月の第3土日」をデータベ...
-
日付
-
windows7のmysqlで今日の日付か...
-
sql serverのsqlについて
-
mysqlでクロス集計を取りたいが...
-
LIKE検索で範囲指定の方法
-
ここで「interval」は どんな働...
おすすめ情報