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