我想知道是否有人可以帮助我。我想编写一个查询来标识汽车的制造商和型号,如果该特定制造商/型号组合之前未售出,则当天仅售出 1
假设我有一个名为 carsSold 的表,它有 4 列:ID、制造商、型号和创建日期,并具有以下数据:
我想要做的是只返回当天创建条目的制造商和型号行,并且只有 1 个这种类型的组合(从历史上的任何日期开始)。如果我的数据集中的 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
询问。 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
)
关于sql - Oracle - 在计数 = 1 的多个列上选择不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41620950/