【问题标题】:handling duplicates on Temporary Tables PostgreSQL处理 PostgreSQL 临时表上的重复项
【发布时间】:2022-09-23 00:07:23
【问题描述】:

我想打印前 40 行,但结果中有很多重复的行。 如何确保不会发生这种情况?

WITH film AS (SELECT 
       m.rental_rate AS rental_price,
       m.length as dur,
       m.rating AS age_rating
    FROM movie AS m      
    WHERE m.rental_rate >2  
    ORDER BY dur DESC
    ),
duration AS (SELECT
             f.rating as age_rating,
       MIN(f.length) AS min_length,
       MAX(f.length) AS max_length,
       AVG(f.length) AS avg_length,
       Min(f.rental_rate) AS min_rental_rate,
       Max(f.rental_rate) AS max_rental_rate,
       AVG(f.rental_rate) AS avg_rental_rate
       FROM movie AS f
       GROUP BY age_rating  
       ORDER BY avg_length ASC)
SELECT 
       film.age_rating,
       duration.min_length,
       duration.max_length,
       duration.avg_length,
       duration.min_rental_rate,
       duration.max_rental_rate,
       duration.avg_rental_rate
FROM film INNER JOIN duration ON film.age_rating = duration.age_rating
LIMIT 40 ;
  • 检查 DISTINCT 如何在 SELECT 中工作,另请参阅:DISTINCT examples
  • 尝试使用 DISTINCT 进行修补。原来没有重复的开始......谢谢!

标签: sql postgresql temp-tables


【解决方案1】:

我不认为您打算这样做,但是您的查询实际上是这样做的:

SELECT
   m.rating as age_rating,
   MIN(f.length) AS min_length,
   MAX(f.length) AS max_length,
   AVG(f.length) AS avg_length,
   Min(f.rental_rate) AS min_rental_rate,
   Max(f.rental_rate) AS max_rental_rate,
   AVG(f.rental_rate) AS avg_rental_rate
 FROM
   movie AS f
   join movie AS m on   
     f.rating = m.rating
 where
   m.rental_rate > 2
 GROUP BY age_rating  
 limit 40

只是有比必要更多的代码。所以发生的事情是你总结评分但随后重新加入所有具有相同评级的电影。

例如,如果您的数据如下所示:

film            rating        length     rental rate
Willy Wonka     R             1:30       4
Gremlins        R             2:00       5
My Little Pony  R             2:30       6

您将获得所有三行(按评级汇总数据),只是没有电影名称。

我相信你想要的要简单得多。我正在阅读一些内容,但我认为您的第一个 CTE 正在尝试按租金过滤电影。如果是这种情况,您应该为电影表返回(并加入)某种形式的键。

试试这个,让我知道这是否是预期的结果。

SELECT
   f.rating as age_rating,
   MIN(f.length) AS min_length,
   MAX(f.length) AS max_length,
   AVG(f.length) AS avg_length,
   Min(f.rental_rate) AS min_rental_rate,
   Max(f.rental_rate) AS max_rental_rate,
   AVG(f.rental_rate) AS avg_rental_rate
 FROM
   movie AS f
 where
   f.rental_rate > 2
 GROUP BY f.rating
 limit 40

最后一点——CTE 中的order by 子句是不必要的、低效的和误导性的。不能保证它们会传播到最终查询,并且在许多情况下会被破坏。将您的排序留到最后一步。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2021-11-06
    • 2022-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多