【问题标题】:SQL Window Function - How to handle since unable to Group BySQL 窗口函数 - 无法分组后如何处理
【发布时间】:2019-01-26 06:04:48
【问题描述】:

这是我第一次在这里发帖。几个月来我一直在悄悄地浏览论坛。

我正在尝试显示类别名称、四分位数和每四分位数的标题数。这是我的 SQL 代码:

SELECT name, standard_quartile, count
FROM 
     (SELECT c.name, ntile(4) over (order by f.rental_duration) as 
     standard_quartile, count(f.title) as count
     FROM category c
     JOIN film_category fc ON c.category_id=fc.category_id
     JOIN film f ON fc.film_id=f.film_id 
     WHERE c.name='Animation' OR c.name='Children' OR c.name='Classics' OR 
     <BR>c.name='Comedy' OR c.name='Family' OR c.name='Music'
     <BR>GROUP BY c.name, f.rental_duration
     <BR>) t1
GROUP BY 1, 2, 3
ORDER BY 1,2

但是,因为我无法按四分位数分组(它是一个窗口函数),所以它没有按我的意愿显示结果。我认为将它放在子查询中可能会使其工作,但事实并非如此。我相信另一个问题是一个四分位数可以有多个与之相关的租赁期限数字。

这就是它的样子:

动画  1 12
动画  1 18
动画  2 9
动画 3 13
动画 4 14
儿童    1 12
儿童    2 9
儿童    2 15
儿童    3 13
儿童 4 11

如果有人能指出我正确的方向或提供有用的提示,我将不胜感激。

计数和分组是我要解决的问题。如果您在显示结果的 sn-p 中看到,Animation 有两个 1 四分位数,Children 有两个 2 四分位数。每一种都应该有。但是由于我不能按四分位数分组,因为它是一个窗口函数,所以它是按rental_duration 分组的。

谢谢! :)

PS - 它应该是这样的:

screenshot of expected query results

【问题讨论】:

  • 您的 PS 似乎只是重复了前面的段落。如果人们不理解您的问题,请找到新的方式来表达您想要表达的意思。我们可以看到看起来是 当前输出 的表格。您能否也添加样本数据预期输出?如果该 PS 部分没有添加任何新内容,请将其删除 - 但请务必尝试以不同的方式解释您的问题。

标签: sql group-by window-functions quartile


【解决方案1】:

我认为您只希望在外部查询中使用 group by

SELECT name, standard_quartile, count(*)
FROM (SELECT c.name,
             ntile(4) over (order by f.rental_duration) as standard_quartile
     FROM category c JOIN
          film_category fc
          ON c.category_id = fc.category_id JOIN
          film f
          ON fc.film_id = f.film_id 
     WHERE c.name IN ('Animation', 'Children', 'Classics', 'Comedy', 'Family', 'Music')
    ) t1
GROUP BY name, standard_quartile
ORDER BY name, standard_quartile;

还要注意在类别列表中使用in

【讨论】:

  • 谢谢!你是对的。并感谢 IN 功能的提示。我还没有学过。很有帮助。
【解决方案2】:
select name , standard_quartile, sum(count)
    FROM(
    SELECT name, standard_quartile, count
    FROM 
         (SELECT c.name, ntile(4) over (order by f.rental_duration) as 
         standard_quartile, count(f.title) as count
         FROM category c
         JOIN film_category fc ON c.category_id=fc.category_id
         JOIN film f ON fc.film_id=f.film_id 
         WHERE c.name='Animation' OR c.name='Children' OR c.name='Classics' OR 
         <BR>c.name='Comedy' OR c.name='Family' OR c.name='Music'
         <BR>GROUP BY c.name, f.rental_duration
         <BR>) t1
    GROUP BY 1, 2, 3) t2
group by 1,2
ORDER BY 1,2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多