Sql 交叉应用以基于日期时间获取特定记录
以下是针对以下场景的sql FIDLE: 基表:Sql 交叉应用以基于日期时间获取特定记录,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,以下是针对以下场景的sql FIDLE: 基表: ╔═══════════════════════╗ ║ Id DateTime ║ ╠═══════════════════════╣ ║ 201 2015-05-03 08:01 ║ ║ 301 2015-05-03 08:20 ║ ║ 401 2015-05-03 08:40 ║ ╚═══════════════════════╝ 将表提取为E: ╔═════════════════════════════════
╔═══════════════════════╗
║ Id DateTime ║
╠═══════════════════════╣
║ 201 2015-05-03 08:01 ║
║ 301 2015-05-03 08:20 ║
║ 401 2015-05-03 08:40 ║
╚═══════════════════════╝
将表提取为E:
╔═══════════════════════════════════════╗
║ Id DateTime Location ║
╠═══════════════════════════════════════╣
║ 201 2015-05-03 07:50 City A ║
║ 201 2015-05-03 08:01 City B ║
║ 201 2015-05-03 08:50 City C ║
║ 301 2015-05-03 07:15 City E ║
║ 301 2015-05-03 08:01 City F ║
║ 301 2015-05-03 08:20 City G ║
║ 401 2015-05-03 07:15 City W ║
║ 401 2015-05-03 08:30 City X ║
║ 401 2015-05-03 08:55 City Y ║
║ 401 2015-05-03 09:00 City Z ║
╚═══════════════════════════════════════╝
预期结果:
╔══════════════════════════════════════╗
║ Location Id DateTime ║
╠══════════════════════════════════════╣
║ City B 201 2015-05-03 08:01 ║
║ City G 301 2015-05-03 08:20 ║
║ City X 401 2015-05-03 08:30 ║
╚══════════════════════════════════════╝
使用以下代码,我得到了ID
201和301的正确结果,但对于401,我需要Extract
表中的第一个最大日期,该日期小于Base
表中的日期,因为Extract
表中没有与Base
表中相同的匹配日期
select ca.Location, B.id, ca.Datetime
from Base B
cross apply(select top 1 Location, DateTime
from Extract E
where B.id = E.id
order by case when B.DateTime = E.DateTime then 1 else 0 end desc,
E.Datetime)ca
请帮助编辑此代码以获得所需的结果。非常感谢。你就快到了。我调整了你的头发
请注意,如果对于某个ID
Extract
表,没有任何日期小于或等于Base
日期,则根本不会返回此ID。如果您确实希望查看Base
表中的每一行,无论Extract
表中有什么,请使用外部应用
而不是交叉应用
。对于位置
和日期时间
,您会得到空值,但所有ID都会在那里。为什么您的选择
查询和所需结果之间的列顺序不同?我更新了select语句。但顺序并不重要。谢谢,哇!你是最棒的。非常感谢你。那起作用了。@sky\u limit,不客气。我使它符合预期的结果。你对这个问题的解释一定有误。我的查询返回Extract
表中的最大(而非最小)日期,该日期小于或等于Base
表中的日期。您是对的。我需要最大的,而你的代码做到了。很抱歉给你带来了困惑。我将编辑这个问题以备将来参考。再次感谢。
select ca.Location, B.id, ca.Datetime
from
Base B
cross apply
(
select top (1) E.Location, E.DateTime
from Extract E
where
B.id = E.id
AND B.DateTime >= E.DateTime
order by E.Datetime DESC
) AS CA