选择所有列,但忽略其中某些具有重复值的记录

问题描述 投票:0回答:1

假设我有一个cars表格。它具有以下列:idcolorenginepriceupholsterymodel_name。到目前为止,我一直在根据前端应用程序传递的条件查询所有汽车。但是,现在我被告知,如果多辆汽车的enginemodel_nameprice值相同,则不应将它们返回,因为它们是重复的。在这种情况下,应退还一辆汽车,并重复多次。因此,我可能需要在group_by上执行某种engine, model_name, price的操作,但是我仍然需要为每条记录获取其他(未分组)列(idcolorupholstery)的值,以及重复计数。

我的API需要保持与旧API的兼容。当前它返回:

[
  {id: 1, color: 'blue', engine: '2.0', price: 20000, upholstery: 'leather', model_name: 'outback'},
  {id: 2, color: 'red', engine: '2.5', price: 20000, upholstery: 'material', model_name: 'wrx'},
  {id: 3, color: 'yellow', engine: '2.5', price: 20000, upholstery: 'leather', model_name: 'wrx'},
]

现在应该是:

[
  {id: 1, color: 'blue', engine: '2.0', price: 20000, upholstery: 'leather', model_name: 'outback', count: 1},
  {id: 2, color: 'red', engine: '2.5', price: 20000, upholstery: 'material', model_name: 'wrx', count: 2},
]

在这种情况下,性能确实很重要。实际上,有更多的列可以从多个表中查询和连接。

sql postgresql group-by greatest-n-per-group
1个回答
0
投票

尝试

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
© www.soinside.com 2019 - 2024. All rights reserved.