[英]Oracle - Select distinct on multiple columns where count = 1
我想知道是否有人可以幫助我。 我想寫一個查詢來確定汽車的制造商和型號,如果該特定制造商/型號組合之前未售出,則當天僅售出1輛
假設我有一個名為 carsSold 的表,它有 4 列:ID、制造商、型號和日期創建,並具有以下數據:
我想要做的只是返回在當天創建條目的制造商和型號行,並且只有一種類型的組合(從歷史上的任何日期開始)。 如果 currentDate 是我的數據集中的 08-08-2016,我希望看到 id 的 1、2、4 和 7。
有可能做到這一切嗎? 從 select 語句中可以實現很多。 我假設它會開始類似於下面的東西,只有它會包含一個不同的和計數的兩行制造商和型號或沿着這些線的東西? 我只是不確定如何實現我所需要的。
select *
from carsSold
where dateCreated > trunc(sysdate)
在此先感謝您抽出寶貴時間查看本文以及我可能會得到的任何幫助。
select min(Id), Manufacturer, Model, min(dateCreated)
from carsSold
group by Manufacturer, Model
having count(*) = 1 and min(dateCreated) = trunc(sysdate);
這是一個非常標准的group by
查詢group by
。 having
保證我們只得到單行的組。 針對dateCreated
的條件必須使用聚合,但由於組中只有一行,因此min()
實際上是同一回事。
釋義:返回制造商和型號的組合被計算一次的所有組,其中最早的日期是當天(或您選擇的任何日期)。id 和創建的日期值被恢復為虛擬聚合。
編輯:我很清楚您不打算追溯運行此查詢,並且您只會對使用當天的日期感興趣。 所以我覺得沒有必要早點發表評論。 但是,如果您確實需要及時回顧,那么添加where dateCreated <= <some date>
並在having
子句中替換相同的日期以便不考慮所有后來創建的行是非常簡單的。
編輯 2 :要簡單地獲取您可以使用的每個組合的最早行not exists
。 實際上有多種方法可以表達這個查詢,但這里是一個簡單的方法。 它甚至與上面的查詢無關。
select * from carsSold c
where not exists (
select 1 from carsSold c2
where
c2.Manufacturer = c.Manufacturer
and c2.Model = c.Model
and c2.dateCreated < c.dateCreated
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.