返回SELECT语句中的匹配或最高行

时间:2016-09-17 04:22:19

标签: sql oracle greatest-n-per-group

我在尝试连接这两个表时只检索两行。

在表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

5 个答案:

答案 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
;