0

以下に説明するように、REPORTS と REPORT_TYPE の 2 つのテーブルがあります。

レポート

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

 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  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 に答える
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重複した s があった場合、これにより重複が発生します。report_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;

更新された 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 に答える
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 に答える
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 に答える