簡體   English   中英

Oracle SQL 查詢以提取包含相同 ID 的行的最大日期的數據

[英]Oracle SQL query to extract data for a maximum date for rows contianing the same ID

我有一張桌子,比如 Table1:

在此處輸入圖像描述

而且,我正在嘗試使用以下條件提取數據:

  1. select A 列中的所有條目是 2 和 5,
  2. B 列中的所有條目為 100
  3. C 列中合約 ID 為 15 的所有數據
  4. 例如,D 列中小於 31.02.2016 的所有日期
  5. 最后,在 G 列中具有最大值的行

如果我使用以下代碼(除了在 G 列中找到最大日期),它工作正常:

Select * from Table1
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')

並給我以下結果: 在此處輸入圖像描述

現在,我想找到所有那些在 G 列中具有最大日期值的行。如果我使用以下內容在這種情況下找到與 G 中的最大日期相對應的行,則查詢運行並且我得到一個空表,其中只有列名:

Select * from Table1 t1
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')
and G = (select MAX(G) from Table1 where G = t1.G)

所需的 output 是:

在此處輸入圖像描述

我究竟做錯了什么?

您可以使用ORDER BYFETCH

select *
from Table1
where A in (2 ,5) and
      B = 100 and
      C = '15' and
      D <= date '2016-01-31'
order by g desc
fetch first 1 row only;

請注意,我還簡化了日期常量的語法。

如果您想要在出現平局的情況下所有行,請使用:

fetch first 1 row with ties;

如果您只想要一排,您可以訂購並限制:

Select * 
from Table1
where
    A in (2 , 5)
    and B = 100
    and C = 15
    and D <= date '2016-01-31'
order by d desc
fetch first 1 row only

如果您想允許頂級關系,那么您可以使用fetch first 1 row with ties而不是。

筆記

  • 我使用文字日期而不是to_date() :這更簡單,更高效(請注意,您的原始格式規范是錯誤的,因為字符串沒有時間部分)

  • 它看起來像列C是數字,所以我刪除了條件中文字值周圍的單引號(如果該列是字符串數據類型,您可以將其更改回來)

如果您需要找到所有那些在 Get 列中具有最大日期值的行,那么您可以使用 window function dense_rank()。 具有相同排名標准值的行將收到相同的排名值:

--get all rows with num=1
Select * from
(
Select *, dense_rank() over (order by G desc) num
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')
) X
Where num=1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM