如何计算行数并避免重复?

时间:2015-11-05 13:24:18

标签: sql postgresql amazon-redshift

对于大学项目,我必须根据一个表的数据计算kpi。该表存储有关超市购物篮和购物订单项及其产品类别的数据。我必须计算在特定商店购买的所有产品类别的产品。所以在表中它看起来像这样:

StoreId   BasketID  CategoryId
1           1           1
1           1           2
1           1           3
1           2           1
1           2           3
1           2           4
2           3           1
2           3           2
2           3           3
2           4           1

作为查询的结果,我想要一个表来计算与商店相关的所有购物篮中的不同产品类别。 像这样:

StoreId   Count(CategoryId)
1            4
2            3

如果我使用硬值进行非动态语句,则表明它正在运行。

select basket_hash, store_id, count(DISTINCT retailer_category_id)
from promo.checkout_item
where store_id = 2
  and basket_hash = 123
GROUP BY basket_hash, store_id;

但是当我尝试以动态方式编写它时,sql会计算每个篮子的数量并将单个数量加在一起。

select store_id,  Count(DISTINCT retailer_category_id) 
from promo.checkout_item
group by store_id;

但是像这样,它并没有比较与商店相关的所有篮子的类别,而且我得到重复,因为一个类别可以在篮子1和篮子2中。

有人可以帮忙吗?!

THX!

2 个答案:

答案 0 :(得分:1)

根据您的预期结果,您想要以下声明吗?

SELECT StoreId,  COUNT(*)
FROM (
       SELECT DISTINCT StoreId, CategoryId 
       FROM table_name
)
GROUP BY StoreId;

请在表格中用表名替换“table_name”。

我不确定什么是“动态方式”的意思。

答案 1 :(得分:0)

我对你的要求感到困惑。这就是我想你的意思:

with checkout_item (store_id, basket_hash, retailer_category_id) as (
    values 
    (1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,3),
    (1,2,4),(2,3,1),(2,3,2),(2,3,3),(2,4,1)
)
select distinct store_id, basket_hash, store_cats, basket_cats
from (
    select store_id, basket_hash,
        max(store_cats) over (partition by store_id) as store_cats,
        max(basket_cats) over (partition by basket_hash) as basket_cats
    from (
        select store_id, basket_hash,
            dense_rank() over (
                partition by store_id
                order by retailer_category_id
            ) as store_cats,
            dense_rank() over (
                partition by basket_hash
                order by retailer_category_id
            ) as basket_cats
        from checkout_item
    ) s
) s
order by 1, 2
;
 store_id | basket_hash | store_cats | basket_cats 
----------+-------------+------------+-------------
        1 |           1 |          4 |           3
        1 |           2 |          4 |           3
        2 |           3 |          3 |           3
        2 |           4 |          3 |           1