2017-07-18 52 views
0

我有其中每行都包含如何保持最新的項目中的所有記錄各組

  • 由乘客(PLNR)
  • 飛行日期飛行的航班數量的Oracle數據庫中(PLDATE )
  • 乘客的票號(TKTNUM)

實施例的內容:

PLNR PLDATE  TKTNUM 
100  10/01/2017 1234 
100  11/01/2017 1235 
100  11/01/2017 1236 
200  9/01/2017 7890 
200  10/01/2017 7891 
200  10/01/2017 5678 

我想保留每個航班號的最新航班中的所有機票號碼。

輸出示例:

PLNR PLDATE  TKTNUM 
100  11/01/2017 1235 
100  11/01/2017 1236 
200  10/01/2017 7891 
200  10/01/2017 5678 

我在網上搜索,發現幾個職位建議使用DENSE_RANK並保持第一,但我與組合多個標準(例如,PLDATE和PLNR),以獲得多個記錄掙扎。

你能否提出一個解決方案,更重要的是,解釋它的工作原理? (我正在翻譯這本書)。

感謝您的幫助!

回答

0
WITH CTE AS (SELECT PLNR, PLDATE, TKTNUM 
        , Dense_Rank()Over (partition by PLNR, Trunc(PLDATE) order by PLDATE DESC) DR) 
SELECT * 
FROM cte 
WHERE DR= 1 

CTE或子查詢是必需的,因爲DR必須在內存中實現,才能限制它。

over語法的分析功能,其用於通過日期降序排序的每個分區(PLNR和TRUNC(PLDATE)分配一個順序等級。由於我們使用DENSE_RANK函數相同日期將被分配相同的值。因此,最新PLDate總會有1元plnr/PLDATE秩

所以CTE結果如下:。

PLNR PLDATE  TKTNUM DR 
100  10/01/2017 1234 2 
100  11/01/2017 1235 1 
100  11/01/2017 1236 1 
200  9/01/2017 7890 2 
200  10/01/2017 7891 1 
200  10/01/2017 5678 1 

,我們只保留1在對CTE的選擇

現在我用過的 Trunc on PLDATE因爲它包含一個時間組件,因爲我們不想要那些搞砸的東西;因爲如果輸入,oracle通常會存儲這兩個文件

+0

謝謝!這工作得很好。 –

1

用途:

SELECT PLNR, PLDATE, TKTNUM 
FROM (
    SELECT t.*, 
     max(PLDATE) Over (Partition By PLNR) As dt 
    FROM table 
) 
WHERE PLDATE = dt 
+0

可能需要trunc PLDate()我認爲oracle總是記錄時間,因此取決於日期如何進入,他們可能有一個時間組件。 – xQbert

相關問題