我需要从SQL中的一个表中获得一个结果列表,这样我就需要一个日期值紧跟在where语句选择的日期之前的行。在下图中,我写道:
select * from Table t where Color = 'blue'但我不知道如何获得蓝色行上方突出显示的行。示例是Excel,但只是为了便于生成示例。“蓝色”在现实生活中是更多的连接和数据,但对于一个最低限度的完整示例,这是可行的。假设日期并不总是按日期时间排序,但我总是想要紧接在“蓝色”条目之前的条目,日期时间明智。

发布于 2019-04-26 02:21:48
如果没有重复的日期,则使用UNION ALL:
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发布于 2019-04-26 02:16:52
您是否能够向行中添加唯一标识,例如整数ID?
如果您能够可靠地建立蓝色行的ID,则可以查询blueRowID - 1。这似乎是解决问题的最直接的方法。
发布于 2019-04-26 02:32:08
您可以使用ROW_NUMBER对它们进行排序,然后选择其正上方的那个。
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'
)https://stackoverflow.com/questions/55855275
复制相似问题