我怎样才能 return 满足特定条件的行列表与它之前的行?
How can I return the list of rows meeting a certain condition with the row just before it?
precise_value_date local_limit_amount
2020-12-10 18:45:37.650 1800000.000000
2020-12-18 19:01:09.530 3225000.000000
2020-12-31 00:00:00.000 1800000.000000
2021-01-18 00:00:00.000 2300000.000000
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
我想return今天日期之后的所有行以及最后一行
意思是如果今天是 2020-12-24 00:00:00.000
我将收到该日期之后的所有数据以及该日期之前的一行
所以获取的数据如下:
precise_value_date local_limit_amount
2020-12-18 19:01:09.530 3225000.000000
2020-12-31 00:00:00.000 1800000.000000
2021-01-18 00:00:00.000 2300000.000000
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
如果今天的日期恰好在其中一个获取的数据中,我只会 return 那些 >= 它而不是最后一行
意思是如果今天是 2021-04-27 00:00:00.000 则 table 将如下所示:
precise_value_date local_limit_amount
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
谢谢!
您可以使用 lead()
:
select t.*
from (select t.*,
lead(precise_value_date) over (order by precise_value_date) as next_precise_value_date
from t
) t
where next_precise_value_date is null or
next_precise_value_date >= curdate()
order by precise_value_date;
或者,您可以使用 union all
:
select x.*
from ((select top (1) t.*
from t
where t.precise_value_date < convert(date, getdate())
order by t.precise_value_date desc
) union all
(select t.*
from t
where t.precise_value_date >= convert(date, getdate())
)
) x;
这看起来像 union all
:
select *
from (
select * from mytable where precise_value_date < current_date
union all
(select * from mytable where precise_value_date >= current_date order by precise_value_date limit 1)
) t
order by precise_value_date
在MySQL中,甚至不需要外层的select
:
select * from mytable where precise_value_date < current_date
union all
(select * from mytable where precise_value_date >= current_date order by precise_value_date limit 1)
order by precise_value_date
在 SQL 服务器中:
select *
from (
select * from mytable where precise_value_date < convert(date, getdate())
union all
(select top (1) * from mytable where precise_value_date >= convert(date, getdate()) order by precise_value_date)
) t
order by precise_value_date
precise_value_date local_limit_amount
2020-12-10 18:45:37.650 1800000.000000
2020-12-18 19:01:09.530 3225000.000000
2020-12-31 00:00:00.000 1800000.000000
2021-01-18 00:00:00.000 2300000.000000
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
我想return今天日期之后的所有行以及最后一行 意思是如果今天是 2020-12-24 00:00:00.000 我将收到该日期之后的所有数据以及该日期之前的一行 所以获取的数据如下:
precise_value_date local_limit_amount
2020-12-18 19:01:09.530 3225000.000000
2020-12-31 00:00:00.000 1800000.000000
2021-01-18 00:00:00.000 2300000.000000
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
如果今天的日期恰好在其中一个获取的数据中,我只会 return 那些 >= 它而不是最后一行 意思是如果今天是 2021-04-27 00:00:00.000 则 table 将如下所示:
precise_value_date local_limit_amount
2021-04-27 00:00:00.000 1500000.000000
2021-07-22 00:00:00.000 500000.000000
2021-08-31 00:00:00.000 500000.000000
2021-12-31 00:00:00.000 0.000000
谢谢!
您可以使用 lead()
:
select t.*
from (select t.*,
lead(precise_value_date) over (order by precise_value_date) as next_precise_value_date
from t
) t
where next_precise_value_date is null or
next_precise_value_date >= curdate()
order by precise_value_date;
或者,您可以使用 union all
:
select x.*
from ((select top (1) t.*
from t
where t.precise_value_date < convert(date, getdate())
order by t.precise_value_date desc
) union all
(select t.*
from t
where t.precise_value_date >= convert(date, getdate())
)
) x;
这看起来像 union all
:
select *
from (
select * from mytable where precise_value_date < current_date
union all
(select * from mytable where precise_value_date >= current_date order by precise_value_date limit 1)
) t
order by precise_value_date
在MySQL中,甚至不需要外层的select
:
select * from mytable where precise_value_date < current_date
union all
(select * from mytable where precise_value_date >= current_date order by precise_value_date limit 1)
order by precise_value_date
在 SQL 服务器中:
select *
from (
select * from mytable where precise_value_date < convert(date, getdate())
union all
(select top (1) * from mytable where precise_value_date >= convert(date, getdate()) order by precise_value_date)
) t
order by precise_value_date