Sql 如何在联接表上指定最大日期
我在加入中得到重复记录,我只想要NSANOTES.NOTEDATE上的最大(最新)日期。请问你是怎么做到的Sql 如何在联接表上指定最大日期,sql,oracle,select,greatest-n-per-group,Sql,Oracle,Select,Greatest N Per Group,我在加入中得到重复记录,我只想要NSANOTES.NOTEDATE上的最大(最新)日期。请问你是怎么做到的 SELECT NSAACTIVITY.NSAID , NSAACTIVITY.NSASERVICEIMPACTED "Type", NSAACTIVITY.NSAAPPROVED, NSAACTIVITY.NSADESCRIPTION, NSANOTES.NSANOTE FROM NSAUSER.NSAACTIVITY INNER JOIN NSAUSER.NSANOTES ON N
SELECT NSAACTIVITY.NSAID ,
NSAACTIVITY.NSASERVICEIMPACTED "Type",
NSAACTIVITY.NSAAPPROVED,
NSAACTIVITY.NSADESCRIPTION,
NSANOTES.NSANOTE
FROM NSAUSER.NSAACTIVITY INNER JOIN NSAUSER.NSANOTES ON NSAACTIVITY.NSAID=NSANOTES.NSAID
WHERE TO_CHAR(NSAACTIVITY.NSASTART, 'yyyy-mm-dd hh24:mi') BETWEEN '2013-06-28 10:59:59' AND '2013-07-01 06:00:01'
你有没有试过使用分组方式? 比如:
SELECT NSAACTIVITY.NSAID ,
NSAACTIVITY.NSASERVICEIMPACTED "Type",
NSAACTIVITY.NSAAPPROVED,
NSAACTIVITY.NSADESCRIPTION,
NSANOTES.NSANOTE,
MAX(NSANOTES.NOTEDATE)
FROM NSAUSER.NSAACTIVITY INNER JOIN NSAUSER.NSANOTES ON NSAACTIVITY.NSAID=NSANOTES.NSAID
WHERE TO_CHAR(NSAACTIVITY.NSASTART, 'yyyy-mm-dd hh24:mi') BETWEEN '2013-06-28 10:59:59' AND '2013-07-01 06:00:01'
GROUP BY NSAACTIVITY.NSAID ,
NSAACTIVITY.NSASERVICEIMPACTED,
NSAACTIVITY.NSAAPPROVED,
NSAACTIVITY.NSADESCRIPTION,
NSANOTES.NSANOTE
你有没有试过使用分组方式? 比如:
SELECT NSAACTIVITY.NSAID ,
NSAACTIVITY.NSASERVICEIMPACTED "Type",
NSAACTIVITY.NSAAPPROVED,
NSAACTIVITY.NSADESCRIPTION,
NSANOTES.NSANOTE,
MAX(NSANOTES.NOTEDATE)
FROM NSAUSER.NSAACTIVITY INNER JOIN NSAUSER.NSANOTES ON NSAACTIVITY.NSAID=NSANOTES.NSAID
WHERE TO_CHAR(NSAACTIVITY.NSASTART, 'yyyy-mm-dd hh24:mi') BETWEEN '2013-06-28 10:59:59' AND '2013-07-01 06:00:01'
GROUP BY NSAACTIVITY.NSAID ,
NSAACTIVITY.NSASERVICEIMPACTED,
NSAACTIVITY.NSAAPPROVED,
NSAACTIVITY.NSADESCRIPTION,
NSANOTES.NSANOTE
我认为类似这样的东西可以达到目的(使用子查询)
我认为类似这样的东西可以达到目的(使用子查询)
我想你是在找下面几行的东西。我了解了在WHERE子句上使用timestamp而不是to_char的线索。Rest只是使用了RANK()函数。希望这有帮助
SELECT *
FROM (SELECT act.NSAID,
act.NSASERVICEIMPACTED "Type",
act.NSAAPPROVED,
act.NSADESCRIPTION,
notes.NSANOTE,
rank()
OVER (PARTITION BY act.NSAID ORDER BY notes.NOTEDATE DESC) rn
FROM NSAUSER.NSAACTIVITY act
INNER JOIN
NSAUSER.NSANOTES notes
ON act.NSAID = notes.NSAID
WHERE act.NSASTART BETWEEN TIMESTAMP '2013-06-28 10:59:59' AND TIMESTAMP '2013-07-01 06:00:01'
)
where rn=1;
我想你是在找下面几行的东西。我了解了在WHERE子句上使用timestamp而不是to_char的线索。Rest只是使用了RANK()函数。希望这有帮助
SELECT *
FROM (SELECT act.NSAID,
act.NSASERVICEIMPACTED "Type",
act.NSAAPPROVED,
act.NSADESCRIPTION,
notes.NSANOTE,
rank()
OVER (PARTITION BY act.NSAID ORDER BY notes.NOTEDATE DESC) rn
FROM NSAUSER.NSAACTIVITY act
INNER JOIN
NSAUSER.NSANOTES notes
ON act.NSAID = notes.NSAID
WHERE act.NSASTART BETWEEN TIMESTAMP '2013-06-28 10:59:59' AND TIMESTAMP '2013-07-01 06:00:01'
)
where rn=1;
您的查询中似乎没有使用NSANOTES.NOTEDATE。重复记录是什么意思?是否复制了整个记录-
NASID
,类型
,NSA批准
,NSASdescription
,NSAONote
?如果是这样,您可以使用选择DISTINCT
。如果没有,答案会有所不同。还要注意,如果您避免在NSASTART
上调用TO_CHAR
,则WHERE
子句的执行速度会快得多。如果您在NSASTART
上有一个索引,如果您将WHERE
更改为WHERE NSAACTIVITY.NSASTART的时间戳为“2013-06-28 10:59:59”和时间戳为“2013-07-01 06:00:01”,则可以使用该索引进行优化。用
TO_CHAR`你能期望的最好的方法就是索引扫描,你甚至可能得不到。对,但我希望显示最新的NSANOTES.NSANOTES。由于加入,我获得了多个记录。如何停止该操作并仍然从NSANOTES中获取最新注释字段?NSANOTES.NOTEDATE似乎未在您的查询中使用。重复记录是什么意思?是否复制了整个记录-NASID
,类型
,NSA批准
,NSASdescription
,NSAONote
?如果是这样,您可以使用选择DISTINCT
。如果没有,答案会有所不同。还要注意,如果您避免在NSASTART
上调用TO_CHAR
,则WHERE
子句的执行速度会快得多。如果您在NSASTART
上有一个索引,如果您将WHERE
更改为WHERE NSAACTIVITY.NSASTART的时间戳为“2013-06-28 10:59:59”和时间戳为“2013-07-01 06:00:01”,则可以使用该索引进行优化。用
TO_CHAR`你能期望的最好的方法就是索引扫描,你甚至可能得不到。对,但我希望显示最新的NSANOTES.NSANOTES。由于加入,我获得了多个记录。如何停止该操作并仍然从NSANOTES获取最新的Notes字段?如果您有两条相同的NSANOTES.NSAID
记录,并且具有相同的NSANOTES.NOTESDATE
值,则仍然会得到重复的记录。但是根据你给我们的,这就是我能想到的,ns在这方面做什么?从NSAUSER.NSAACTIVITY内部,在NSAACTIVITY.NSAID=nsaonotes.nsaids上加入NSAUSER.nsaonotes ns。NSAID是一个别名,您可以在查询中使用该别名来引用NSAUSER.nsaonotes。如果您有两个相同nsaonotes.NSAID
值的记录,则仍然会得到重复。但是根据你给我们的,这就是我能想到的,ns在这方面做什么?从NSAUSER.NSAACTIVITY内部,在NSAACTIVITY.NSAID=NSANOTES.nsaids上加入NSAUSER.nsacotes ns。NSAID提供一个别名,您可以在查询中使用该别名来引用NSAUSER.nsainotes