Oracle - 在count = 1的多个列上选择distinct

时间:2017-01-12 19:02:14

标签: sql oracle oracle11g

我想知道是否有人可以帮助我。我想编写一个查询,用于识别当前销售仅1 的汽车的制造商和型号,如果特定的制造商/型号组合尚未售出

假设我有一个名为carsSold的表,它有4列:ID,制造商,型号和dateCreated,并具有以下数据: Table Data

我想要做的只是返回当天创建条目的制造商和模型行,并且只有1种类型的组合(从历史记录中的任何日期开始)。如果currentDate是我的数据集中的08-08-2016,我希望看到id为1,2,4和7。

有可能做到这一切吗?从select语句中实现它似乎相当多。我假设它会开始类似下面的东西,只是它会包含两行制造商和模型的不同和计数或沿着这些线的东西?我只是不确定如何实现我所需要的。

 select * 
 from carsSold
 where dateCreated > trunc(sysdate)

提前感谢您花时间查看此内容以及我可能获得的任何帮助。

1 个答案:

答案 0 :(得分:2)

select min(Id), Manufacturer, Model, min(dateCreated)
from carsSold
group by Manufacturer, Model
having count(*) = 1 and min(dateCreated) = trunc(sysdate);

这是一个非常标准的group by查询。 having保证我们只获得一行的组。针对dateCreated的条件必须使用聚合,但由于组中只有一行,因此min()实际上是相同的。

释义:返回制造商和模型组合计算一次的所有组,其中最早的日期是当天(或您选择的任何日期).id和创建的日期值将作为虚拟聚合恢复。 / p>

编辑:我很清楚,您不打算追溯性地运行此查询,并且您只对使用当前日期感兴趣天。所以我没有觉得有必要提前做出这个评论。但是如果你确实需要及时回顾,那么添加where dateCreated <= <some date>并在having子句中替换相同的日期是非常简单的,这样就不会考虑所有后来创建的行。 / p>

编辑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
)