Sql 选择所有列,但忽略其中某些列上具有重复值的记录
假设我有一张Sql 选择所有列,但忽略其中某些列上具有重复值的记录,sql,postgresql,group-by,greatest-n-per-group,Sql,Postgresql,Group By,Greatest N Per Group,假设我有一张cars表。它有以下列:id,color,engine,price,内饰,车型名称。到目前为止,我一直在根据前端应用程序通过的标准查询所有汽车。但是,现在我被告知,如果多辆车的发动机、车型名称和价格值相同,则不应返回,因为它们是重复的。在这种情况下,应返回一辆车,同时返回多个副本。因此,我可能需要对引擎、型号名称、价格执行某种分组操作,但我仍然需要为每条记录获取其他(未分组)列的值(id、color、内饰),以及重复计数 我的API需要与旧API保持一致。目前它返回: [ {id:1
cars
表。它有以下列:id
,color
,engine
,price
,内饰
,车型名称
。到目前为止,我一直在根据前端应用程序通过的标准查询所有汽车。但是,现在我被告知,如果多辆车的发动机
、车型名称
和价格
值相同,则不应返回,因为它们是重复的。在这种情况下,应返回一辆车,同时返回多个副本。因此,我可能需要对引擎、型号名称、价格执行某种分组操作,但我仍然需要为每条记录获取其他(未分组)列的值(id
、color
、内饰
),以及重复计数
我的API需要与旧API保持一致。目前它返回:
[
{id:1,颜色:'blue',发动机:'2.0',价格:20000,内饰:'leather',车型名称:'outback'},
{id:2,颜色:'red',发动机:'2.5',价格:20000,内饰:'material',型号名称:'wrx'},
{id:3,颜色:“黄色”,发动机:“2.5”,价格:20000,内饰:“皮革”,型号名称:“wrx”},
]
现在应该是:
[
{id:1,颜色:'blue',发动机:'2.0',价格:20000,内饰:'leather',型号名称:'outback',计数:1},
{id:2,颜色:'red',发动机:'2.5',价格:20000,内饰:'material',型号名称:'wrx',计数:2},
]
在这种情况下,性能确实很重要。实际上,可以从多个表中查询和连接更多的列。试试看
WITH duplicates AS (
SELECT
MIN(id) AS min_id,
engine,
price,
model_name,
COUNT(*) AS number_of_duplicates
FROM
cars
GROUP BY
engine,
model_name,
price
)
SELECT
c.id,
c.color,
d.engine,
d.price,
c.upholstery,
d.model_name,
d.number_of_duplicates
FROM
cars c
INNER JOIN duplicates d ON c.id = d.min_id
您可以使用窗口分析函数count(..)over(partition by…)
和row\u number()
:
您可以使用distinct on
和分析功能执行此操作:
select distinct on (engine, model_name, price) c.*,
count(*) over (partition by engine, model_name, price) as cnt
from cars c
order by engine, model_name, price;
select distinct on (engine, model_name, price) c.*,
count(*) over (partition by engine, model_name, price) as cnt
from cars c
order by engine, model_name, price;