繁体   English   中英

聚合的连接或分组 - SQL

[英]Joins or group-by for aggregates - SQL

如果以前有人问过这个问题,请原谅我——如果没有例子,很难用语言准确地说出我想要做什么。

我有下表

食物
贝德福德郡 比萨
贝德福德郡 意大利面
贝德福德郡 土豆
布里斯托尔 饼干
布里斯托尔 比萨
布里斯托尔 帕尼尼
白金汉郡 帕尼尼

我想抓住一组包含食物“披萨”和“土豆”的县,以及 go 对大型数据集中的多个成对组合(然后是 3 种不同类型)的食物执行此操作。 运行此查询的最有效的 SQL 风格方法是什么 - 可能连接不好,groupbys 和联合是好的?

编辑:结果可能看起来像,例如

披萨+帕尼尼 比萨+土豆
贝德福德郡 0 1
布里斯托尔 0 0
白金汉郡 0 0

如果您想要与所有拥有它们的国家/地区的食物对,那么我建议您使用聚合进行自我加入:

select t1.food, t2.food, array_agg(t1.country)
from t t1 join
     t t2
     on t1.country = t2.country and t1.food < t2.food
group by t1.food, t2.food;

上述公式假设country / food对在表中是唯一的。

也许这可能会有所帮助。 结果见: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5c70f511c075f086cb1fafc33c2606fe

因为您使用的是雪花,所以您可以使用 list_agg()

with content as (
select 
id,
group_concat(item," ") as food
from
table_acc
group by 1)


select
content.id,
sum(case when content.food like    '%iz%' 
         and  content.food  like  '%nin%'
         then 1 else  0 end)  as count_pizza_and_panini,
sum(case when content.food like    '%iz%' 
         and  content.food  like  '%tat%'
         then 1 else  0 end)  as count_pizza_and_potato
           
from content
group by 1

如果您在大型数据集上运行此程序,则应避免自连接,并使用表的单遍执行 SQL:

WITH COUNTY_FOOD as (
SELECT CAST('Bedfordshire' AS VARCHAR(255)) AS "County", 
       CAST('Pizza' AS VARCHAR(255)) AS "Food" 
UNION ALL 
      SELECT CAST('Bedfordshire' AS VARCHAR(255)) AS "County", 
             CAST('Pasta' AS VARCHAR(255)) AS "Food"
UNION ALL 
      SELECT CAST('Bedfordshire' AS VARCHAR(255)) AS "County", 
             CAST('Potatoes' AS VARCHAR(255)) AS "Food"
UNION ALL 
      SELECT CAST('Bristol' AS VARCHAR(255)) AS "County", 
             CAST('Biscuits' AS VARCHAR(255)) AS "Food"
UNION ALL 
      SELECT CAST('Bristol' AS VARCHAR(255)) AS "County", 
             CAST('Pizza' AS VARCHAR(255)) AS "Food"
UNION ALL 
      SELECT CAST('Bristol' AS VARCHAR(255)) AS "County", 
             CAST('Panini' AS VARCHAR(255)) AS "Food"
UNION ALL 
      SELECT CAST('Buckinghamshire' AS VARCHAR(255)) AS "County", 
             CAST('Panini' AS VARCHAR(255)) AS "Food"
) 
--Apply Boolean Logic to pivoted columns
SELECT "County" AS "County", 
    iff("sum_Pizza">0 and "sum_Panini">0,1,0) AS "Pizza + Panini", 
    iff("sum_Pizza">0 and "sum_Potatoes">0,1,0) AS "Pizza + Potatoes" 
    FROM (
        --pivot out columns for each food type
         SELECT "County", SUM("Pizza") AS "sum_Pizza", SUM("Panini") AS "sum_Panini", SUM("Potatoes") AS "sum_Potatoes"
            FROM (
                    SELECT "County", 
                iff("Food"='Pizza',1,0) AS "Pizza", 
                iff("Food"='Panini',1,0) AS "Panini", 
                iff("Food"='Potatoes',1,0) AS "Potatoes"
                    FROM COUNTY_FOOD
                 )
         GROUP BY  "County"
         )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM