Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择所有列,但忽略其中某些列上具有重复值的记录_Sql_Postgresql_Group By_Greatest N Per Group - Fatal编程技术网

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;