Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交叉应用以基于日期时间获取特定记录_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 交叉应用以基于日期时间获取特定记录

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: ╔═════════════════════════════════

以下是针对以下场景的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            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