我在尝试连接这两个表时只检索两行。
在表A中:我有一个ID和日期
在表B中:我有一个ID和时间戳。
我的选择是检索4行,但是,我想从表B中选择与表A中的日期匹配的时间戳(条件1)。当找到两个日期(条件2)时,我想选择具有最新时间戳的日期。
这是模特:
SELECT A.ID, B.TIMESTAMP FROM A, B
WHERE A.ID = B.ID
表A
ID || Date
1 || 09/17/2016
2 || 02/02/2016
表B
ID||TIMESTAMP
1 || 17-SEP-16 12.50.40.754543000 PM
1 || 19-SEP-16 12.56.40.754543000 PM
2 || 02-FEB-08 10.31.36.154000000 PM
2 || 02-FEB-08 10.31.32.284000000 PM
结果
ID || TIMESTAMP
1 || 17-SEP-16 12.50.40.754543000 PM
2 || 02-FEB-08 10.31.36.154000000 PM
答案 0 :(得分:0)
SELECT A.ID,
B.TIMESTAMP
FROM B
join a
on a.id = b.id
and a.time_stamp = (select max(timestamp), id from b group by id)
答案 1 :(得分:0)
试试这个,
CREATE TABLE TABLE1
(
ID Int,
Date Date
)
CREATE TABLE TABLE2
(
ID int,
Timestamp Datetime
)
INSERT INTO TABLE1 VALUES(1,'09/17/2001')
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:10:12.013')
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:15:15.015')
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:18:15.015')
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:25:15.015')
SELECT * FROM TABLE1
SELECT * FROM TABLE2
SELECT A.ID, C.Timestamp
FROM TABLE1 AS A
CROSS APPLY (SELECT MAX(B.Timestamp) AS Timestamp
FROM TABLE2 AS B
WHERE A.ID = B.ID) AS C
答案 2 :(得分:0)
您似乎正在寻找来自相同ID的最早的日期时间。你可以尝试下面的例子。
SELECT A.ID, MIN(B.TIMESTAMP) AS TIMESTAMP FROM A INNER JOIN B ON A.ID = B.ID GROUP BY A.ID
答案 3 :(得分:0)
检查此查询,
SELECT A.ID, A.Date, C.ID , CONVERT(VARCHAR,C.Timestamp,100) AS Timestam
FROM TABLE1 AS A
CROSS APPLY (SELECT ID,MAX(B.Timestamp) AS Timestamp
FROM TABLE2 AS B
WHERE A.ID = B.ID GROUP BY ID) AS C
答案 4 :(得分:0)
您需要分两步完成此操作。首先,您需要在时间戳的日期组件与表A中的日期匹配的条件下加入。您没有说明如果表B中没有匹配的时间戳会发生什么,如果在您的现实生活中甚至可能数据。在下面的解决方案中,我假设您不希望这些行(来自表A)完全出现在结果集中。如果您的要求不同,请说明,也许可以调整解决方案。
然后,您需要按ID分组并选择最大时间戳。在下面的解决方案中,我假设ID是表A中的唯一键。如果您在表A中有多个具有相同ID的行,具有不同的日期,则需要根据您的FULL要求修改解决方案;最有可能的是,DATE必须添加到GROUP BY子句中。
解决方案假设Date是纯日期(时间组件等于00:00:00)。
注意:我没有使用“timestamp”和“date”作为列名;它们是保留关键字,不应用作列名。我改用了ts和dt。
select a.id, max(b.ts) as ts
from a inner join b
on a.id = b.id and b.ts >= a.dt and b.ts < a.dt + 1
group by a.id
;