簡體   English   中英

從表中選擇比較對

[英]Selecting compared pairs from table

我真的不知道該怎么形容。 我有一張桌子:

ID |   Name  | Date
-------------------------
 1 | Mike    | 01.01.2016
 1 | Michael | 02.03.2016
 2 | Samuel  | 23.12.2015
 2 | Sam     | 05.03.2015
 3 | Tony    | 02.04.2012

我想選擇每對中具有最新日期的ID和名稱對。 這里的結果應該是:

ID |   Name  | Date
-------------------------
 1 | Michael | 02.03.2016
 2 | Samuel  | 23.12.2015
 3 | Tony    | 02.04.2012

我該如何實現?

Oracle數據庫11g

您可以使用ROW_NUMBER()分析函數來完成此操作:

SELECT id, name, "date"
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY id ORDER BY "date" DESC ) rn
  FROM   table_name t
)
WHERE rn = 1

這僅需要單個表掃描(它沒有自聯接或相關的子查詢-即IN (...)EXISTS(...) )。

有一個子選擇返回每個id及其最大日期:

select * from table
where (id, date) in (select id, max(date) from table group by id)

您可以使用NOT EXISTS()

SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
                 WHERE t.id = s.id and s.date > t.date)

可能最有效的方法是:

select t.*
from table t
where t.date = (select max(date) from table t2 where t2.id = t.id);

以及table(id, date)上的索引。

此版本應掃描表並在索引中查找正確的值。

或者,如果只有三列,則可以使用keep

select id, max(date) as date,
       max(name) keep (dense_rank first order by date desc) as name
from table
group by id;

我發現該版本在Oracle中運行良好。

暫無
暫無

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

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