【问题标题】:Check if item exists for each partition检查每个分区是否存在项目
【发布时间】:2021-07-23 16:52:07
【问题描述】:

假设有 5 个购物袋需要装满 3 或 4 个不同的物品。事先已经决定了每个购物车需要哪些商品。

这个信息。以下列方式在 excel 文件中描绘。

Bag Item
1 milk
cheese
eggs
honey
2 ham
chicken
pork
fish
3 bread
mayo
ketchup
4 potato chips
broccoli
mixed greens
5 Jalapeno peppers
ice cream
yogurt

商店中可用商品的列表也以 Excel 文件中的一列形式提供 - 并非所有商品都在商店中可用。

Item
milk
cheese
honey
bread
mayo
ketchup
potato chips
broccoli
mixed greens

我想退回购物袋和可以装满的物品。在上面的例子中,我们可以看到袋子 3 和 4 可以完全装满。我该怎么做?

开放使用 Python、Pandas 和 SQl。我在 excel 中做了一个非常简单的 vlookup,但我有超过一百万行,不可能全部排序以查看哪些袋子已完全装满。

提前致谢!

【问题讨论】:

  • 这几乎与调酒师问题相同,调酒师手头有配料,我们有一个饮料字典和这些饮料所需的相应配料。目标是找出哪些调酒师可以制作哪些饮料,假设如果手头有一种配料,那么涉及该配料的任何/所有饮料都足够。有很多解决方案。我会发一个。这比您的问题要复杂一些,因为您只有一家商店(调酒师)。

标签: python sql excel pandas


【解决方案1】:

与调酒师问题相比,将“装有物品的袋子”视为“需要配料的饮料”,而“有物品的商店”就像“手头有配料的调酒师”。

这是一个合乎逻辑的解决方案,例如:

CREATE TABLE cms_user (
   user_id        int PRIMARY KEY
 , name           varchar(20)
);

INSERT INTO cms_user (user_id, name)
     VALUES (1,'User1'), (2,'User2'), (3,'User3')
;

CREATE TABLE cms_user_ingredient_rs (
   user_id        int
 , ingredient_id  int
 , PRIMARY KEY (user_id, ingredient_id)
);

INSERT INTO cms_user_ingredient_rs (user_id, ingredient_id)
     VALUES (1,1), (1,2), (1,3), (1,5), (2,2), (2,3), (2,4)
          , (3,1), (3,2), (3,3), (3,5), (3,6)
;

CREATE TABLE cms_drink (
   drink_id       int PRIMARY KEY
 , name           varchar(20)
);

INSERT INTO cms_drink (drink_id, name)
     VALUES (10,'Test'), (15,'Test2')
;

CREATE TABLE cms_drink_ingredient_rs (
   drink_id       int
 , ingredient_id  int
 , PRIMARY KEY (drink_id, ingredient_id)
);

INSERT INTO cms_drink_ingredient_rs (drink_id, ingredient_id)
     VALUES (10,1), (10,3), (10,5), (15,1), (15,6)
;

WITH v2 AS (
         SELECT t1.drink_id      drink_id
              , t1.ingredient_id ingredient_id
              , v1.user_id       user_id
           FROM cms_drink_ingredient_rs AS t1
           CROSS JOIN cms_user AS v1
     )
SELECT v2.user_id, v2.drink_id
  FROM v2
  LEFT JOIN cms_user_ingredient_rs v3
    ON (v2.ingredient_id,v2.user_id) = (v3.ingredient_id,v3.user_id)
 GROUP BY v2.user_id, v2.drink_id
HAVING COUNT(if(v3.user_id IS NULL, 1, null))=0
;

+---------+----------+
| user_id | drink_id |
+---------+----------+
|       1 |       10 |
|       3 |       10 |
|       3 |       15 |
+---------+----------+

注意:还有其他解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2015-10-09
    • 2018-12-25
    相关资源
    最近更新 更多