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 返回SELECT语句中的匹配行或最高行_Sql_Oracle_Greatest N Per Group - Fatal编程技术网

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

Sql 返回SELECT语句中的匹配行或最高行,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,当连接这两个表时,我尝试只检索两行 在表A中:我有一个ID和日期 在表B中:我有一个ID和时间戳 我的select正在检索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 ||

当连接这两个表时,我尝试只检索两行

在表A中:我有一个ID和日期

在表B中:我有一个ID和时间戳

我的select正在检索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
试试这个

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

似乎您正在从同一ID查找最早的日期时间。您可以尝试以下示例

SELECT A.ID, MIN(B.TIMESTAMP) AS TIMESTAMP FROM A INNER JOIN B ON A.ID  = B.ID GROUP BY A.ID
检查此查询

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

您需要分两步完成此操作。首先,您需要在时间戳的日期组件与表A中的日期匹配的条件下加入。您没有说如果表B中没有匹配的时间戳,那么应该发生什么,如果这在您的实际数据中是可能的话。在下面的解决方案中,我假设您根本不希望这些行(来自表A)出现在结果集中。如果您的要求不同,请这样说,也许可以调整解决方案

然后需要按ID分组并选择最大时间戳。在下面的解决方案中,我假设ID是表a中的唯一键。如果相反,您可能在表a中有多行具有相同ID、日期不同,则需要根据您的全部要求修改解决方案;最有可能的情况是,必须将日期添加到GROUPBY子句中

解决方案假定日期是纯日期(时间分量等于00:00:00)

注意:我没有使用“时间戳”和“日期”作为列名;它们是保留关键字,不应用作列名。我用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
;
选择a.id,max(b.ts)作为ts
从a到b的内部连接
关于a.id=b.id和b.ts>=a.dt和b.ts
学习使用正确的连接。当您觉得需要在FROM语句中键入逗号时,这表示您做错了什么。即使使用联接,select仍将返回两行,但比较只应返回一行。选择B.TIMESTAMP FROM B JOIN A ON A.ID=B.ID您的问题,并添加一些示例数据和基于该数据的预期输出。文本请,数据集已添加到PostThank。如果我只想选择最大值,这肯定会起作用。但是,在这种情况下,如果我想先检查A.DATE=B.TIMESTAMP,如果有一个匹配,我会选择它。但是,如果有多个匹配,那么选择具有最新时间戳的一个。先谢谢你,谢谢。在这两种情况下,您的查询都会选择最大时间戳。我已经在最初的帖子中更新了表格示例图像。谢谢。查询仍在为两个ID选择最大时间戳。对于ID:1,我应该选择2016年9月17日12.50.40.754543000下午作为邮票,对于ID:2202-FEB-0810.31.36.154000000下午。我在最初的帖子中发布了一个更新的表格示例。感谢Oracle中没有
convert()
(我也不明白为什么首先需要转换时间戳)查询为两个ID选择最小值。我希望找到ID 1和ID 2的精确匹配。我在最初的帖子中发布了表格示例屏幕截图。谢谢。您所说的“ID 1的精确匹配和ID 2的最大匹配”是什么意思?如果有多行,可能是ID 3、4??例如,对于ID 1,查询应该首先查找匹配的时间戳,如果查询找到一个匹配的时间戳,那么它将选择该时间戳。如果查询找到两个匹配的时间戳,那么它会选择最近的时间戳。我把结果集的一个例子放在最初的post图像中。谢谢
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
;