如何返回满足特定条件的行列表以及它之前的行?

Posted

技术标签:

【中文标题】如何返回满足特定条件的行列表以及它之前的行?【英文标题】:How can I return the list of rows meeting a certain condition with the row just before it? 【发布时间】:2020-12-24 16:06:24 【问题描述】:
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

我想返回今天日期之后的所有行以及最后一行 意思是如果今天是 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

如果今天的日期恰好在其中一个获取的数据中,我只会将 >= 返回给它,而不是最后一行 这意味着如果今天是 2021-04-27 00:00:00.000,则表格如下:

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

谢谢!

【问题讨论】:

【参考方案1】:

你可以使用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;

【讨论】:

Limit 1 旁边不断出现不正确的语法 select * from ( select * from #temp7 whereprecision_value_date = GETDATE() order byprecision_value_date限制 1) ) t order byprecision_value_date 我使用的是 SQL Server 2018 对操作符的一个小整改就成功了!这个查询现在是功能性的 select * from ( select * from mytable whereprecision_value_date >= convert(date, getdate()) union all (select top (1) * from mytable whereprecision_value_date @HoussemTimoumi 。 . .您的问题最初被标记为 mysql,这就是我使用 limit 的原因。我修复了 SQL Server 的答案。 DESC 也应该添加到前 1 个订单中,因为我们将在当前日期之前添加最后一行,再次感谢! select * from ( select * from mytable whereprecision_value_date >= convert(date, getdate()) union all (select top (1) * from mytable whereprecise_value_date 【参考方案2】:

这看起来像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 Server 中:

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

【讨论】:

Limit 1 旁边不断出现不正确的语法 select * from ( select * from #temp7 whereprecision_value_date = GETDATE() order byprecision_value_date限制 1) ) t order byprecision_value_date 我使用的是 SQL Server 2018 @HoussemTimoumi:那你为什么要标记MySQL这个问题?这是与 SQL Server 不同的产品。无论如何,请参阅我的更新。 我的错!这个查询现在是功能性的 select * from ( select * from mytable whereprecision_value_date >= convert(date, getdate()) union all (select top (1) * from mytable whereprecision_value_date

以上是关于如何返回满足特定条件的行列表以及它之前的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使不满足特定条件的行不出现在结果中

在匹配选择条件的行之前选择 n 行

HIVE/Impala 查询:计算满足特定条件的行之间的行数

获取数据表中满足特定条件的行数

如何在特定条件下返回不同的行?

只读大文本文件中满足特定条件的行