Sql 如何基于另一个表中的id选择表中最新的行

Sql 如何基于另一个表中的id选择表中最新的行,sql,oracle,Sql,Oracle,我有两个表,报告和报告类型,如下所述 报告 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

我有两个表,报告和报告类型,如下所述

报告

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
我需要基于报表类型表中每个报表id的创建日期的最新pdf和xls报表,以及报表类型说明
报表id是报表类型中的主键,是报表中的外键
对于报告名称,pdf和xls报告的创建日期将相同
如果需要更多详细信息,请发表评论
有什么想法吗

这是我尝试过的,但显然不起作用。我想我需要一些逻辑来将当前的迭代报告类型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)
这将为您提供所有最新的文件。显然可以过滤

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

试试这个

select report_name,report_type_desc inner join
 on reports.id=report_type.id 
 where creationdate=max(creationdate)
 group by reports.id,report_name
试试这个

select report_name,report_type_desc inner join
 on reports.id=report_type.id 
 where creationdate=max(creationdate)
 group by reports.id,report_name
试试这个:

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;
对于您发布的示例数据,这将为您提供:

| 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_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |
请注意:如果存在重复的
报告ID
且与样本数据中的最大日期相同,则这将为您提供重复的
报告ID
。如果要消除重复项,可以执行以下操作:

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;
这将为您提供:

| 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_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |
试试这个:

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;
对于您发布的示例数据,这将为您提供:

| 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_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |
请注意:如果存在重复的
报告ID
且与样本数据中的最大日期相同,则这将为您提供重复的
报告ID
。如果要消除重复项,可以执行以下操作:

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;
这将为您提供:

| 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_NAME | CREATION_DATE | REPORT_TYPE_DESC |
--------------------------------------------------------------
|       100 | Report2.pdf |   29-Nov-2012 |      ReportType1 |
|       101 | Report3.pdf |   28-Nov-2012 |      ReportType2 |

到目前为止您尝试了哪些查询?到目前为止您尝试了哪些查询?谢谢!!看起来这很有效。我们将使用更多数据进行一些测试。谢谢!!看起来这很有效。我会用更多的数据做一些测试。谢谢。这似乎也在起作用。我现在有点困惑。Grisha的解决方案看起来更小,连接数更少,但会有任何问题吗?第一个解决方案是我想要的,因为我想要pdf和excel报表files@jijo它与中的谓词
几乎相同,我使用了一个额外的
连接
,但是这没关系,但是您必须注意
IN
谓词中
SELECT
中的
NULL
值。另请参阅我的更新,还有另一种方法可以使用排名函数
ROW\u NUMBER()
。谢谢。这似乎也在起作用。我现在有点困惑。Grisha的解决方案看起来更小,连接数更少,但会有任何问题吗?第一个解决方案是我想要的,因为我想要pdf和excel报表files@jijo它与
中的谓词
几乎相同,我使用了一个额外的
连接
,但是这没关系,但是您必须注意
IN
谓词中
SELECT
中的
NULL
值。另请参阅我的更新,还有另一种方法可以使用排名函数
ROW\u NUMBER()