sql - Oracle - 在计数 = 1 的多个列上选择不同

标签 sql oracle oracle11g

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

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

我想要做的是只返回当天创建条目的制造商和型号行,并且只有 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/

相关文章:

database - 我如何在 Toad for Oracle 中定义主外键?

mysql - 对于所有现在或曾经在乐队中的艺术家来说,该艺术家在乐队中呆了多久

oracle - 创建索引是否应该立即更新 Oracle 查询计划?

mysql - 计算 Oracle 表中特定值之间模式的出现次数

java - 确保事务的 ACID 属性的责任在哪里?

linux - 更改系统日期值?

mysql - 进行插入时获取并使用唯一 ID

java - 如何在Java中连接2个csv文件

sql - 有没有办法仅在存在最大值时从 SQL/Access 中的字段返回值?

java - 在 Hibernate 4.2.21 中删除表的所有行