SQL:如何仅使用在两列之间具有一定数量的唯一组合的数据?

Posted

技术标签:

【中文标题】SQL:如何仅使用在两列之间具有一定数量的唯一组合的数据?【英文标题】:SQL: How do I use only data that has a certain amount of unique combinations between two columns? 【发布时间】:2018-03-22 01:35:27 【问题描述】:

假设我有三列,make、year 和 msrp,我只想在那里显示 make/year 组合数量超过的行,例如 10。这是因为有些品牌只有一年的数据,并且我不希望我的数据中有随机的汽车制造商。

我能够获得每个品牌的年份/品牌组合数,但我不知道如何包含其他列。 我有疑问:

SELECT 品牌、计数(DISTINCT 年份)

来自汽车

按品牌分组

它给出了这样的东西:

make    | count
--------------
Honda   | 13
Ford    | 17
Bugatti | 3
...

但我想要类似的东西:

make    | count | year | msrp
----------------------
Honda   | 13    | 2001 | 100
Honda   | 13    | 2002 | 200
Honda   | 13    | 2003 | 300
Ford    | 17    | 2001 | 100
Ford    | 17    | 2002 | 200
Ford    | 17    | 2003 | 300
Bugatti | 1     | 2014 | 1000

并且只显示计数 > 一个数字(可能是 10)的行 * 数据示例组成*

【问题讨论】:

什么是 DBMS?提供一些样本数据 @D-Shih 我正在使用 data.world 编写查询。我把csv放在我的github上供你访问github.com/SudeepS97/cars-csv/blob/master/cars.csv 【参考方案1】:

我怀疑你并不需要count(distinct)。所以,要获取信息:

select make, year, msrp,
       count(*) over (partition by make) as num_make_years
from cars;

如果要过滤,则使用子查询:

select my.*
from (select make, year, msrp,
             count(*) over (partition by make, year) as num_make_years
      from cars
     ) my
where num_make_years > 10;

【讨论】:

【参考方案2】:
SELECT make, count(DISTINCT year) OVER (PARTITION BY make) "Count", year, msrp
FROM cars
GROUP BY make, year, msrp
HAVING count(make) > 10 and count(year) > 10

【讨论】:

这没有达到我想要的效果。不过感谢您的帮助! 尝试添加分区方式

以上是关于SQL:如何仅使用在两列之间具有一定数量的唯一组合的数据?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 根据两列删除重复记录

模式构建器 laravel 迁移在两列上是唯一的

如何使用 python 在两列中扩展具有日期范围的数据框?

Access 2016 SQL:查找不同表的两列之间的最小绝对差

如何检测熊猫数据框在两列范围之间是不是有重复项?

在两列上检查唯一性的有效方法?