首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询在表中向上获取一行

SQL查询在表中向上获取一行
EN

Stack Overflow用户
提问于 2019-04-26 02:06:59
回答 4查看 276关注 0票数 0

我需要从SQL中的一个表中获得一个结果列表,这样我就需要一个日期值紧跟在where语句选择的日期之前的行。在下图中,我写道:

代码语言:javascript
复制
select * from Table t where Color = 'blue'

但我不知道如何获得蓝色行上方突出显示的行。示例是Excel,但只是为了便于生成示例。“蓝色”在现实生活中是更多的连接和数据,但对于一个最低限度的完整示例,这是可行的。假设日期并不总是按日期时间排序,但我总是想要紧接在“蓝色”条目之前的条目,日期时间明智。

EN

回答 4

Stack Overflow用户

发布于 2019-04-26 02:21:48

如果没有重复的日期,则使用UNION ALL:

代码语言:javascript
复制
select * from Table where Color = 'blue'
union all
select * from Table t 
where 
  t.Color is null 
  and
  (
    select color from Table where date = (
      select min(date) from Table where date > t.date)
  ) = 'blue'
order by date
票数 3
EN

Stack Overflow用户

发布于 2019-04-26 02:16:52

您是否能够向行中添加唯一标识,例如整数ID?

如果您能够可靠地建立蓝色行的ID,则可以查询blueRowID - 1。这似乎是解决问题的最直接的方法。

票数 0
EN

Stack Overflow用户

发布于 2019-04-26 02:32:08

您可以使用ROW_NUMBER对它们进行排序,然后选择其正上方的那个。

代码语言:javascript
复制
DECLARE @t TABLE ([Date] DATE,Color VARCHAR(20))
INSERT INTO @t([Date],Color) SELECT '12/31/2019',''
INSERT INTO @t([Date],Color) SELECT '01/01/2019',''
INSERT INTO @t([Date],Color) SELECT '01/02/2019','blue'
INSERT INTO @t([Date],Color) SELECT '01/03/2019',''
INSERT INTO @t([Date],Color) SELECT '01/04/2019',''
INSERT INTO @t([Date],Color) SELECT '01/05/2019','blue'


SELECT
    *
FROM (
    select *,ROW_NUMBER() OVER (ORDER BY [Date] ASC) AS [Row] from @t
) SetA
WHERE Color = 'blue'
OR SetA.[Row] IN (
    SELECT [Row]-1 FROM (
        select *,ROW_NUMBER() OVER (ORDER BY [Date] ASC) AS [Row] from @t
    )a 
    WHERE Color = 'blue'
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55855275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档