仅显示一次ID,仅显示最新日期的记录

时间:2014-11-01 19:53:24

标签: ms-access

亲爱的女士们,先生们, 不幸的是我对sql编程完全不熟悉,所以我为任何明确的错误或缺乏知识而道歉 - 对于我的Access数据库,我有一个表“report”,其中“reportnumber”为id(每个报告可以有不同日期的多个版本)以及“reportdate”。

我现在希望我的查询只显示最后一个“reportnumber”的最新“reportdate”。

我已经尝试了以下我找到的sql代码并对其进行了调整但它只给出了错误消息(声明中的语法与OWNER ACCESS OPTION?):

SELECT reportnumber, MAX(reportdate) AS LatestDate FROM report 
GROUP BY reportnumber 
WITH numbered AS ( SELECT reportnumber, reportdate
ROW_NUMBER() OVER (PARTITION BY reportnumber 
ORDER BY reportdate DESC) AS rownum FROM report ) 
SELECT reportnumber, reportdate  
FROM numbered WHERE rownum = 1;

我真的很感谢你的帮助。 非常感谢和亲切的问候,

Daniel Funk

2 个答案:

答案 0 :(得分:0)

您可以使用简单的group by子句来完成此操作。

编辑以获取group by子句中聚合列的其他行值,您可以使用子查询。由于我不确定您的附加列是什么,因此我添加了一个名为title的列。

以下是示例,我将澄清下面发生的事情。

http://sqlfiddle.com/#!2/61c3a/15

drop table if exists report;
create table report
(reportnumber mediumint,
 reportdate date,
 title varchar(60));

insert into report
values
(1, '2014-04-01', 'mysql tutorial, part 1'), 
(1, '2014-04-04', 'mysql tutorial, part 2'), 
(2, '2014-11-05', 'hbase tutorial, part 1'), 
(2, '2014-11-08', 'hbase tutorial, part 2');

select r.*, r2.title
from (
  select reportnumber, max(reportdate) as maxdate
  from report
  group by reportnumber
) r
inner join report r2
on r.reportnumber = r2.reportnumber
and r.maxdate = r2.reportdate;

子查询的结果(即上面第一个from子句中的查询)基本上被视为一个表。考虑到这一点,我们可以将常规表report加入到子查询r的聚合结果中,以便为其他列提取正确的值(在本例中为{{1}列)。

如果你是sql的新手,这可能有点难以理解,但是阅读它几次并且它将开始有意义。祝你好运!

答案 1 :(得分:0)

假设我理解你正在问什么,请尝试相关的子查询。

我在此假设您有其他列需要提取与给定报告编号的最新报告日期相匹配的行,以便我添加其他列。

SELECT reportnumber, reportdate, reportinfo
FROM report
WHERE reportdate = (SELECT max(reportdate) FROM report r2
                     WHERE r2.reportnumber = report.reportnumber)

如果另一方面,您只需要一个包含最新reportdate的报告编号,那么一个简单的GROUP BY就可以了。

SELECT reportnumber, MAX(reportdate)
FROM report
GROUP BY reportnumber