0

我有两个表,REPORTS 和 REPORT_TYPE,如下所述。

报告

REPORT_TYPE_ID   REPORT_NAME   CREATION_DATE
 100        Report1.pdf    28-Nov-2012
 100       Report1.xls     28-Nov-2012
 100       Report2.pdf     29-Nov-2012
 100       Report2.xls     29-Nov-2012
 101       Report3.pdf     28-Nov-2012
 101       Report3.xls     28-Nov-2012

报告类型

 REPORT_TYPE_ID  REPORT_TYPE_DESC
  100        ReportType1
  101        ReportType2

我需要基于 REPORT_TYPE 表中每个报告 ID 的创建日期的最新 pdf 和 xls 报告,以及报告类型描述。
Report_id 是report_type 中的主键和REPORTS 中的外键。
报告名称的 pdf 和 xls 报告的创建日期相同。
如果需要更多详细信息,请发表评论。
有任何想法吗?

这是我尝试过的,但显然没有奏效。我想我需要一些逻辑来将当前迭代的 report_type_id 从外部查询传递到内部查询。

SELECT AR.REPORT_TYPE_ID, LK.REPORT_TYPE_DESC, 
         AR.REPORT_NAME, AR.CREATION_DATE                                             
         FROM REPORTS  AR, REPORT_TYPE LK                    
         WHERE AR.REPORT_TYPE_ID = LK.REPORT_TYPE_ID
          AND AR.CREATION_DATE IN 
          (SELECT MAX (CREATION_DATE) FROM REPORTS AR, REPORT_TYPE LK  
          WHERE AR.REPORT_TYPE_ID = LK.REPORT_TYPE_ID)
4

5 回答 5

3
 Select * from REPORTS 
  where (REPORT_ID, CREATION_DATE) 
 in (
   select REPORT_ID, MAX(CREATION_DATE)
  from REPORTS
  group by REPORT_ID)
于 2012-12-12T06:59:03.017 回答
1

试试这个:

SELECT 
  r.report_id,
  r.report_name, 
  r.creation_date, 
  t.REPORT_TYPE_DESC
FROM REPORT_TYPE t
INNER JOIN Reports r ON t.REPORT_ID = r.REPORT_ID
INNER JOIN
( 
   SELECT REPORT_ID, MAX(creation_date) maxdate
  FROM reports
  GROUP BY REPORT_ID
 ) m  ON r.Creation_date = m.maxdate
     AND r.REPORT_ID = m.REPORT_ID;

SQL 小提琴演示

对于您发布的示例数据,这将为您提供:

| REPORT_ID | REPORT_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.xls |   29-Nov-2012 |      ReportType1 |
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.xls |   28-Nov-2012 |      ReportType2 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |

请注意:Report_ID如果有重复report_id的 s 与您的示例数据中的最大日期相同,这将为您提供重复。如果你想消除重复,你可以这样做:

WITH cte
AS
(
  SELECT 
    r.report_id,
    r.report_name, 
    r.creation_date, 
    t.REPORT_TYPE_DESC,
    ROW_NUMBER() OVER(PARTITION BY r.report_id 
                      ORDER BY creation_date DESC) AS "rank"
  FROM REPORT_TYPE t
  INNER JOIN Reports r ON t.REPORT_ID = r.REPORT_ID
 ) 
SELECT REPORT_ID, REPORT_NAME, CREATION_DATE,   REPORT_TYPE_DESC
FROM CTE 
WHERE "rank" = 1;

更新的 SQL Fiddle 演示

这会给你:

| REPORT_ID | REPORT_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |
于 2012-12-12T07:01:30.467 回答
1
select  r1.report_id, r1.report_name, r1.creation_date, r2.report_type_desc
from reports r1 join report_type r2 on r1.report_id = r2.report_id 
where r1.creation_date in 
                        (
                         select max(creation_date) 
                         from reports 
                         where report_id = r1.report_id
                        )
于 2012-12-12T07:02:26.003 回答
0
Select * 
  from REPORTS 
  where (REPORT_ID, CREATION_DATE) in (
    select REPORT_ID, MAX(CREATION_DATE)
      from REPORTS
      group by REPORT_ID
  ) 

这将为您提供所有最新文件。显然可以过滤。

于 2012-12-12T06:56:54.607 回答
0

试试这个

select report_name,report_type_desc inner join
 on reports.id=report_type.id 
 where creationdate=max(creationdate)
 group by reports.id,report_name
于 2012-12-12T06:57:49.090 回答