Oracle SQL 最接近给定日期的日期
Oracle SQL closest date to given date
我有一个 table,其中有一列用于类别、日期和价格。
像这样:
group 1 - 03.03.2019 - 5.00
group 1 - 03.02.2018 - 4.00
group 2 - 05.05.2019 - 2.25
group 2 - 05.05.2018 - 1.00
所以每组(几乎)总是有两个日期有两个不同的价格。现在我需要写一个 SQL 语句来获得每组最接近给定日期的日期(f.e。05.05.2019)。第 1 组有两个日期,SQL 语句需要 Select 其中一个最接近给定日期。这需要对所有组都发生。
我试了几个小时,但卡住了。感谢您的帮助
这是一个使用 not exists
的选项:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where
t1.category = t.category
and greatest(t1.date, date '2019-05-05') - least(t1.date, date '2019-05-05')
< greatest(t.date, date '2019-05-05') - least(t.date, date '2019-05-05')
)
这将为您提供每个组的 "closest" 到 2019-05-05 的记录(无论是之前还是之后)。
如果,例如,你想要最近的记录之前 2019-05-05,那就简单一点:
select t.*
from mytable t
where
t.date <= date '2019-05-05'
and not exists (
select 1
from mytable t1
where t1.category = t.category and t1.date <= date '2019-05-05' and t1.date > t.date
)
您可以在这里使用排名功能
select category, date_value, price from (
select category, date_value, price,
rank() over (partition by category order by
abs(to_date('2019-05-05','yyyy-mm-dd') - to_date(date_value, 'yyyy-mm-dd')) asc ) rnk
from yourtable )
where rnk = 1
我有一个 table,其中有一列用于类别、日期和价格。 像这样:
group 1 - 03.03.2019 - 5.00
group 1 - 03.02.2018 - 4.00
group 2 - 05.05.2019 - 2.25
group 2 - 05.05.2018 - 1.00
所以每组(几乎)总是有两个日期有两个不同的价格。现在我需要写一个 SQL 语句来获得每组最接近给定日期的日期(f.e。05.05.2019)。第 1 组有两个日期,SQL 语句需要 Select 其中一个最接近给定日期。这需要对所有组都发生。
我试了几个小时,但卡住了。感谢您的帮助
这是一个使用 not exists
的选项:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where
t1.category = t.category
and greatest(t1.date, date '2019-05-05') - least(t1.date, date '2019-05-05')
< greatest(t.date, date '2019-05-05') - least(t.date, date '2019-05-05')
)
这将为您提供每个组的 "closest" 到 2019-05-05 的记录(无论是之前还是之后)。
如果,例如,你想要最近的记录之前 2019-05-05,那就简单一点:
select t.*
from mytable t
where
t.date <= date '2019-05-05'
and not exists (
select 1
from mytable t1
where t1.category = t.category and t1.date <= date '2019-05-05' and t1.date > t.date
)
您可以在这里使用排名功能
select category, date_value, price from (
select category, date_value, price,
rank() over (partition by category order by
abs(to_date('2019-05-05','yyyy-mm-dd') - to_date(date_value, 'yyyy-mm-dd')) asc ) rnk
from yourtable )
where rnk = 1