我怎样才能 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