Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 - Fatal编程技术网

SQL-我想不出任何方法来做到这一点,我已经做了所有的研究?

SQL-我想不出任何方法来做到这一点,我已经做了所有的研究?,sql,postgresql,Sql,Postgresql,这是我的汽车表,有1000行。每个品牌或制造商有不同的型号,同一型号可以有不同的价格。 我必须在每个制造商的所有型号中输出最小价格,我想不出任何方法来做到这一点。 最接近我的是 SELECT make, model, min(price) FROM car GROUP BY model, make ORDER BY make; 哪个输出527行 但我想在每个品牌的所有型号中选择最低价格。 救命 在Postgres中,我建议distinct on为此: select distinct on (

这是我的汽车表,有1000行。每个品牌或制造商有不同的型号,同一型号可以有不同的价格。 我必须在每个制造商的所有型号中输出最小价格,我想不出任何方法来做到这一点。 最接近我的是

SELECT make, model, min(price) FROM car
GROUP BY model, make
ORDER BY make;
哪个输出527行

但我想在每个品牌的所有型号中选择最低价格。
救命

在Postgres中,我建议
distinct on
为此:

select distinct on (make) c.*
from cars c
order by make, price asc;

在Postgres中,我建议使用
distinct on
,以便:

select distinct on (make) c.*
from cars c
order by make, price asc;

从你的问题来看,你似乎想要每种产品的最低价格。 在我看来,下面的问题会有所帮助

SELECT make,MIN(price) from car
group by make
order by make;

从你的问题来看,你似乎想要每种产品的最低价格。 在我看来,下面的问题会有所帮助

SELECT make,MIN(price) from car
group by make
order by make;
假设您需要“每个品牌的最低价格型号”,您可以根据给出的答案轻松获得每个品牌的最低价格,但这不会给出型号名称

我建议使用窗口函数对数据进行排序,按品牌进行分区,按价格升序排序。然后只需选择排名1的所有行

同一品牌内的两款车型可能价格相同。在这种情况下,您将返回两行。如果这是一种可能性,也是一个问题,您必须进行进一步处理,以决定如何打破平局或将行合并为一行(例如,通过连接模型名称)。

假设您需要“每个品牌的最低价格模型”,您可以根据给出的答案轻松获得每个品牌的最低价格,但这不会给你的模型名称

我建议使用窗口函数对数据进行排序,按品牌进行分区,按价格升序排序。然后只需选择排名1的所有行

同一品牌内的两款车型可能价格相同。在这种情况下,您将返回两行。如果这是一种可能性,也是一个问题,您必须进行进一步的处理,以决定如何打破平局或将行合并为一行(例如,通过连接模型名称)。

使用
rank()
窗口函数在
CTE
中过滤最低价格:

with cte as (
  select *, 
    rank() over (partition by model order by price) rn 
  from car
)
select id, make, model, price
from cte
where rn = 1
order by make;
这将以最低价格退回领带。
如果您不需要领带,请将
rank()
替换为
row\u number()

我假设两个制造商不能使用模型名称。如果情况并非如此,则改为:

rank() over (partition by make, model order by price) rn
CTE
中使用
rank()
窗口函数过滤最低价格:

with cte as (
  select *, 
    rank() over (partition by model order by price) rn 
  from car
)
select id, make, model, price
from cte
where rn = 1
order by make;
这将以最低价格退回领带。
如果您不需要领带,请将
rank()
替换为
row\u number()

我假设两个制造商不能使用模型名称。如果情况并非如此,则改为:

rank() over (partition by make, model order by price) rn

我认为您正在寻找一个简单的左连接

select t1.make, t1.model, t2.min_price 
from car t1 left join (select make, min(price) min_price from car group by make) t2 on 
t1.make=t2.make

我认为您正在寻找一个简单的左连接

select t1.make, t1.model, t2.min_price 
from car t1 left join (select make, min(price) min_price from car group by make) t2 on 
t1.make=t2.make


样本数据最好以如下方式表示。有关如何创建美观的表的一些提示,请参阅。除了@a_horse_和_no_name所说的之外,请不要使用
数据库
标记,除非您对数据库设计有疑问。样本数据的可能重复最好以以下形式表示。有关如何创建美观的表格的一些提示,请参阅。除了@a_horse_和_no_name所说的之外,请不要使用
数据库
标记,除非您对数据库设计有疑问。可能重复您的第2段,或者为上下文提供一些参考?@MayankPant,请参阅Forpas的答案以获取代码示例(和我的注释)。您能否详细说明您的第2段或为上下文提供一些参考?@MayankPant,请参阅Forpas的答案以获取代码示例(和我的注释)。这种类型的SQL命令对我来说是新的。你能告诉我更多关于在哪里学习这类命令的信息吗?@MayankPant<文档中描述了上的代码>DISTINCT ON:。这种类型的SQL命令对我来说是新的。你能告诉我更多关于在哪里学习这类命令的信息吗?@MayankPant<文档中描述了上的代码>DISTINCT ON:。谢谢,但我还希望输出中包含模型名称。谢谢,但我还希望输出中包含模型名称。这种类型的SQL命令对我来说是新命令。你能告诉我在哪里学习这些类型的命令吗。任何参考资料。您可以阅读有关窗口功能的官方文档:对于CTEs:Forpas,您希望按品牌进行划分。在这种情况下,每个品牌中的型号将根据价格进行排序。@Steve现在我明白您的意思了,但我假设型号名称是唯一的(意味着其他制造商不能使用型号名称),正确的?所以不需要另一个级别的分区。@Forpas,我想我们需要他澄清一下,但是按模型进行分区(假设没有两个品牌有相同的命名模型)只会过滤掉每个模型中价格较高的“副本”——它找不到每个品牌最便宜的模型(这就是我推断他的需求的方式)。如果他确实需要后者,那么您将在Make和Model上进行分区,以避免在两个不同的Make中过滤相同的命名模型(我承认,对于汽车来说,这是一种遥远的可能性,但潜力是存在的——例如,捷豹420,一款非常旧的汽车,以及宝马420,一款现代汽车)。这种SQL命令对我来说是新的。你能告诉我在哪里学习这些类型的命令吗。任何参考资料。您可以阅读有关窗口功能的官方文档:对于CTEs:Forpas,您希望按品牌进行划分。在这种情况下,每个品牌中的型号将根据价格进行排序。@Steve现在我明白您的意思了,但我假设型号名称是唯一的(意味着其他制造商不能使用型号名称),正确的?所以不需要另一个级别的分区。@Forpas,我想我们需要他澄清一下,但是按模型分区(假设没有两个make有相同的分区)-