[英]Oracle SQL query to extract data for a maximum date for rows contianing the same ID
我有一張桌子,比如 Table1:
而且,我正在嘗試使用以下條件提取數據:
如果我使用以下代碼(除了在 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 BY
和FETCH
:
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.