Sql Access-查询以提取每个唯一opportunity的最新条目

Sql Access-查询以提取每个唯一opportunity的最新条目,sql,ms-access,Sql,Ms Access,从名为tblNotes的表中,我需要为每个opportunityid获取最新的notedata 以下是tblNotes中的数据 以下是我希望数据的样子: 我对SQL了解不多,但我发现我需要一个内部查询。我所做的阅读表明Access将notesdate存储为日期和时间代码 这是我拼凑的代码 SELECT t1.* FROM tblNotes AS t1 INNER JOIN (SELECT opportunityid, notesdata, MAX(notesdate) AS Max

从名为
tblNotes
的表中,我需要为每个
opportunityid
获取最新的
notedata

以下是
tblNotes
中的数据

以下是我希望数据的样子:

我对SQL了解不多,但我发现我需要一个内部查询。我所做的阅读表明Access将
notesdate
存储为日期和时间代码

这是我拼凑的代码

SELECT t1.*
FROM tblNotes AS t1 INNER JOIN 
    (SELECT opportunityid, notesdata, MAX(notesdate) AS MaxDate 
     FROM tblnotes GROUP BY opportunityid, notesdata)  
    AS t2 ON (t1.opportunityid=t2.opportunityid) AND  (t1.notesdate=t2.MaxDate);
下面是我得到的:

正如你所看到的…甚至不接近。我想基本结构就藏在那里的某个地方……也许吧

谢谢,

我想你想要:

select n.*
from tblNotes as n
where n.notesId = (select top 1 n2.notesId
                   from tblNotes as n2
                   where n2.opportunityId = n.opportunityId
                   order by n2.notesDate desc, n2.notesId desc
                  );
假设
notesid
是主键,则每个
opportunityId
返回一行,即使最近的日期有多个注释。如果希望所有注释都在最近的日期,请使用:

select n.*
from tblNotes as n
where n.notesDate = (select max(t2.notesDate)
                     from tblNotes as n2
                     where n2.opportunityId = n.opportunityId
                    );
我想你想要:

select n.*
from tblNotes as n
where n.notesId = (select top 1 n2.notesId
                   from tblNotes as n2
                   where n2.opportunityId = n.opportunityId
                   order by n2.notesDate desc, n2.notesId desc
                  );
假设
notesid
是主键,则每个
opportunityId
返回一行,即使最近的日期有多个注释。如果希望所有注释都在最近的日期,请使用:

select n.*
from tblNotes as n
where n.notesDate = (select max(t2.notesDate)
                     from tblNotes as n2
                     where n2.opportunityId = n.opportunityId
                    );

我认为这是干净的:从输入创建一个带有oppty id和每个oppty id的max notes date的内联搜索表,并在较小表的两列上将该表内部连接回输入:

DROP TABLE input;                                                                  
CREATE TABLE 
input(notesid,opportunityid,notesdate,notesuser,notesdata) AS 
          SELECT  5,0,DATE '2020-07-14',3,'kkk'
UNION ALL SELECT  3,1,DATE '2020-07-14',2,'another test to run'
UNION ALL SELECT  1,1,DATE '2020-07-14',2,'This is just a test. Next action is..'
UNION ALL SELECT  9,1,DATE '2020-07-27',4,'test'
UNION ALL SELECT 12,1,DATE '2020-07-28',1,'another day in paradise'
UNION ALL SELECT 13,1,DATE '2020-08-14',1,'another test .. maybe this time'
UNION ALL SELECT  2,6,DATE '2020-07-14',3,'another test to see how it works'
;

SELECT
  i.*
FROM input i
INNER JOIN (
  SELECT
    opportunityid
  , MAX(notesdate) AS notesdate
  FROM input
  GROUP BY opportunityid
) m
  ON m.opportunityid=i.opportunityid
 AND m.notesdate    =i.notesdate
-- out  notesid | opportunityid | notesdate  | notesuser |            notesdata            
-- out ---------+---------------+------------+-----------+---------------------------------
-- out        2 |             6 | 2020-07-14 |         3 | another test to see how it works
-- out        5 |             0 | 2020-07-14 |         3 | kkk
-- out       13 |             1 | 2020-08-14 |         1 | another test .. maybe this time

我认为这是干净的:从输入创建一个带有oppty id和每个oppty id的max notes date的内联搜索表,并在较小表的两列上将该表内部连接回输入:

DROP TABLE input;                                                                  
CREATE TABLE 
input(notesid,opportunityid,notesdate,notesuser,notesdata) AS 
          SELECT  5,0,DATE '2020-07-14',3,'kkk'
UNION ALL SELECT  3,1,DATE '2020-07-14',2,'another test to run'
UNION ALL SELECT  1,1,DATE '2020-07-14',2,'This is just a test. Next action is..'
UNION ALL SELECT  9,1,DATE '2020-07-27',4,'test'
UNION ALL SELECT 12,1,DATE '2020-07-28',1,'another day in paradise'
UNION ALL SELECT 13,1,DATE '2020-08-14',1,'another test .. maybe this time'
UNION ALL SELECT  2,6,DATE '2020-07-14',3,'another test to see how it works'
;

SELECT
  i.*
FROM input i
INNER JOIN (
  SELECT
    opportunityid
  , MAX(notesdate) AS notesdate
  FROM input
  GROUP BY opportunityid
) m
  ON m.opportunityid=i.opportunityid
 AND m.notesdate    =i.notesdate
-- out  notesid | opportunityid | notesdate  | notesuser |            notesdata            
-- out ---------+---------------+------------+-----------+---------------------------------
-- out        2 |             6 | 2020-07-14 |         3 | another test to see how it works
-- out        5 |             0 | 2020-07-14 |         3 | kkk
-- out       13 |             1 | 2020-08-14 |         1 | another test .. maybe this time

NotesID是一个PK。进一步检查后,第一块代码几乎满足了我的需要。删除1周围的括号后,查询将根据
opportunityid
返回结果,其中包含相关的
notesid
。我需要为没有相应“notesid”的任何
opportunityid
返回一个空条目。有什么想法吗?如果更合适的话,我会提出一个新问题。谢谢。回复到这是正确的解决方案,因为它确实回答了我提出的问题。NotesID是一个PK。进一步检查后,第一块代码几乎满足了我的需要。删除1周围的括号后,查询将根据
opportunityid
返回结果,其中包含相关的
notesid
。我需要为没有相应“notesid”的任何
opportunityid
返回一个空条目。有什么想法吗?如果更合适的话,我会提出一个新问题。谢谢。回到这是正确的解决方案,因为它确实回答了我提出的问题。