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()
。