Sql 如何在联接表上指定最大日期

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

我在加入中得到重复记录,我只想要NSANOTES.NOTEDATE上的最大(最新)日期。请问你是怎么做到的

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