{ "data": { "question": { "questionId": "3891", "questionFrontendId": "3554", "categoryTitle": "Database", "boundTopicId": 3680766, "title": "Find Category Recommendation Pairs", "titleSlug": "find-category-recommendation-pairs", "content": "

Table: ProductPurchases

\n\n
\n+-------------+------+\n| Column Name | Type | \n+-------------+------+\n| user_id     | int  |\n| product_id  | int  |\n| quantity    | int  |\n+-------------+------+\n(user_id, product_id) is the unique identifier for this table. \nEach row represents a purchase of a product by a user in a specific quantity.\n
\n\n

Table: ProductInfo

\n\n
\n+-------------+---------+\n| Column Name | Type    | \n+-------------+---------+\n| product_id  | int     |\n| category    | varchar |\n| price       | decimal |\n+-------------+---------+\nproduct_id is the unique identifier for this table.\nEach row assigns a category and price to a product.\n
\n\n

Amazon wants to understand shopping patterns across product categories. Write a solution to:

\n\n
    \n\t
  1. Find all category pairs (where category1 < category2)
  2. \n\t
  3. For each category pair, determine the number of unique customers who purchased products from both categories
  4. \n
\n\n

A category pair is considered reportable if at least 3 different customers have purchased products from both categories.

\n\n

Return the result table of reportable category pairs ordered by customer_count in descending order, and in case of a tie, by category1 in ascending order lexicographically, and then by category2 in ascending order.

\n\n

The result format is in the following example.

\n\n

 

\n

Example:

\n\n
\n

Input:

\n\n

ProductPurchases table:

\n\n
\n+---------+------------+----------+\n| user_id | product_id | quantity |\n+---------+------------+----------+\n| 1       | 101        | 2        |\n| 1       | 102        | 1        |\n| 1       | 201        | 3        |\n| 1       | 301        | 1        |\n| 2       | 101        | 1        |\n| 2       | 102        | 2        |\n| 2       | 103        | 1        |\n| 2       | 201        | 5        |\n| 3       | 101        | 2        |\n| 3       | 103        | 1        |\n| 3       | 301        | 4        |\n| 3       | 401        | 2        |\n| 4       | 101        | 1        |\n| 4       | 201        | 3        |\n| 4       | 301        | 1        |\n| 4       | 401        | 2        |\n| 5       | 102        | 2        |\n| 5       | 103        | 1        |\n| 5       | 201        | 2        |\n| 5       | 202        | 3        |\n+---------+------------+----------+\n
\n\n

ProductInfo table:

\n\n
\n+------------+-------------+-------+\n| product_id | category    | price |\n+------------+-------------+-------+\n| 101        | Electronics | 100   |\n| 102        | Books       | 20    |\n| 103        | Books       | 35    |\n| 201        | Clothing    | 45    |\n| 202        | Clothing    | 60    |\n| 301        | Sports      | 75    |\n| 401        | Kitchen     | 50    |\n+------------+-------------+-------+\n
\n\n

Output:

\n\n
\n+-------------+-------------+----------------+\n| category1   | category2   | customer_count |\n+-------------+-------------+----------------+\n| Books       | Clothing    | 3              |\n| Books       | Electronics | 3              |\n| Clothing    | Electronics | 3              |\n| Electronics | Sports      | 3              |\n+-------------+-------------+----------------+\n
\n\n

Explanation:

\n\n\n\n

The result is ordered by customer_count in descending order. Since all pairs have the same customer_count of 3, they are ordered by category1 (then category2) in ascending order.

\n
\n", "translatedTitle": "查找类别推荐对", "translatedContent": "

表:ProductPurchases

\n\n
\n+-------------+------+\n| Column Name | Type | \n+-------------+------+\n| user_id     | int  |\n| product_id  | int  |\n| quantity    | int  |\n+-------------+------+\n(user_id, product_id) 是这张表的唯一主键。\n每一行代表用户以特定数量购买的一种产品。\n
\n\n

表:ProductInfo

\n\n
\n+-------------+---------+\n| Column Name | Type    | \n+-------------+---------+\n| product_id  | int     |\n| category    | varchar |\n| price       | decimal |\n+-------------+---------+\nproduct_id 是这张表的唯一主键。\n每一行表示一件商品的类别和价格。\n
\n\n

亚马逊想要了解不同产品类别的购物模式。编写一个解决方案:

\n\n
    \n\t
  1. 查找所有 类别对(其中 category1 < category2
  2. \n\t
  3. 对于 每个类别对,确定 同时 购买了两类别产品的 不同用户 数量
  4. \n
\n\n

如果至少有 3 个不同的客户购买了两个类别的产品,则类别对被视为 可报告的

\n\n

返回可报告类别对的结果表以 customer_count 降序 排序,并且为了防止排序持平,以 category1 字典序 升序 排序,然后以 category2 升序 排序。

\n\n

结果格式如下所示。

\n\n

 

\n\n

示例:

\n\n
\n

输入:

\n\n

ProductPurchases 表:

\n\n
\n+---------+------------+----------+\n| user_id | product_id | quantity |\n+---------+------------+----------+\n| 1       | 101        | 2        |\n| 1       | 102        | 1        |\n| 1       | 201        | 3        |\n| 1       | 301        | 1        |\n| 2       | 101        | 1        |\n| 2       | 102        | 2        |\n| 2       | 103        | 1        |\n| 2       | 201        | 5        |\n| 3       | 101        | 2        |\n| 3       | 103        | 1        |\n| 3       | 301        | 4        |\n| 3       | 401        | 2        |\n| 4       | 101        | 1        |\n| 4       | 201        | 3        |\n| 4       | 301        | 1        |\n| 4       | 401        | 2        |\n| 5       | 102        | 2        |\n| 5       | 103        | 1        |\n| 5       | 201        | 2        |\n| 5       | 202        | 3        |\n+---------+------------+----------+\n
\n\n

ProductInfo 表:

\n\n
\n+------------+-------------+-------+\n| product_id | category    | price |\n+------------+-------------+-------+\n| 101        | Electronics | 100   |\n| 102        | Books       | 20    |\n| 103        | Books       | 35    |\n| 201        | Clothing    | 45    |\n| 202        | Clothing    | 60    |\n| 301        | Sports      | 75    |\n| 401        | Kitchen     | 50    |\n+------------+-------------+-------+\n
\n\n

输出:

\n\n
\n+-------------+-------------+----------------+\n| category1   | category2   | customer_count |\n+-------------+-------------+----------------+\n| Books       | Clothing    | 3              |\n| Books       | Electronics | 3              |\n| Clothing    | Electronics | 3              |\n| Electronics | Sports      | 3              |\n+-------------+-------------+----------------+\n
\n\n

解释:

\n\n\n\n

结果按 customer_count 降序排列。由于所有对都有相同的客户数量 3,它们按 category1(然后是 category2)升序排列。

\n
\n", "isPaidOnly": false, "difficulty": "Hard", "likes": 0, "dislikes": 0, "isLiked": null, "similarQuestions": "[]", "contributors": [], "langToValidPlayground": "{\"cpp\": false, \"java\": false, \"python\": false, \"python3\": false, \"mysql\": false, \"mssql\": false, \"oraclesql\": false, \"c\": false, \"csharp\": false, \"javascript\": false, \"typescript\": false, \"bash\": false, \"php\": false, \"swift\": false, \"kotlin\": false, \"dart\": false, \"golang\": false, \"ruby\": false, \"scala\": false, \"html\": false, \"pythonml\": false, \"rust\": false, \"racket\": false, \"erlang\": false, \"elixir\": false, \"pythondata\": false, \"react\": false, \"vanillajs\": false, \"postgresql\": false, \"cangjie\": false}", "topicTags": [ { "name": "Database", "slug": "database", "translatedName": "数据库", "__typename": "TopicTagNode" } ], "companyTagStats": null, "codeSnippets": [ { "lang": "MySQL", "langSlug": "mysql", "code": "# Write your MySQL query statement below", "__typename": "CodeSnippetNode" }, { "lang": "MS SQL Server", "langSlug": "mssql", "code": "/* Write your T-SQL query statement below */", "__typename": "CodeSnippetNode" }, { "lang": "Oracle", "langSlug": "oraclesql", "code": "/* Write your PL/SQL query statement below */", "__typename": "CodeSnippetNode" }, { "lang": "Pandas", "langSlug": "pythondata", "code": "import pandas as pd\n\ndef find_category_recommendation_pairs(product_purchases: pd.DataFrame, product_info: pd.DataFrame) -> pd.DataFrame:\n ", "__typename": "CodeSnippetNode" }, { "lang": "PostgreSQL", "langSlug": "postgresql", "code": "-- Write your PostgreSQL query statement below", "__typename": "CodeSnippetNode" } ], "stats": "{\"totalAccepted\": \"88\", \"totalSubmission\": \"107\", \"totalAcceptedRaw\": 88, \"totalSubmissionRaw\": 107, \"acRate\": \"82.2%\"}", "hints": [], "solution": null, "status": null, "sampleTestCase": "{\"headers\":{\"ProductPurchases\":[\"user_id\",\"product_id\",\"quantity\"],\"ProductInfo\":[\"product_id\",\"category\",\"price\"]},\"rows\":{\"ProductPurchases\":[[1,101,2],[1,102,1],[1,201,3],[1,301,1],[2,101,1],[2,102,2],[2,103,1],[2,201,5],[3,101,2],[3,103,1],[3,301,4],[3,401,2],[4,101,1],[4,201,3],[4,301,1],[4,401,2],[5,102,2],[5,103,1],[5,201,2],[5,202,3]],\"ProductInfo\":[[101,\"Electronics\",100],[102,\"Books\",20],[103,\"Books\",35],[201,\"Clothing\",45],[202,\"Clothing\",60],[301,\"Sports\",75],[401,\"Kitchen\",50]]}}", "metaData": "{\"mysql\":[\"CREATE TABLE if not exists ProductPurchases (\\n user_id INT,\\n product_id INT,\\n quantity INT\\n)\",\"CREATE TABLE if not exists ProductInfo (\\n product_id INT,\\n category VARCHAR(100),\\n price DECIMAL(10, 2)\\n)\"],\"mssql\":[\"CREATE TABLE ProductPurchases (\\n user_id INT,\\n product_id INT,\\n quantity INT\\n)\",\"CREATE TABLE ProductInfo (\\n product_id INT,\\n category VARCHAR(100),\\n price DECIMAL(10, 2)\\n)\"],\"oraclesql\":[\"CREATE TABLE ProductPurchases (\\n user_id NUMBER,\\n product_id NUMBER,\\n quantity NUMBER\\n)\",\"CREATE TABLE ProductInfo (\\n product_id NUMBER,\\n category VARCHAR2(100),\\n price NUMBER(10, 2)\\n)\"],\"postgresql\":[\"CREATE TABLE ProductPurchases (\\n user_id INTEGER,\\n product_id INTEGER,\\n quantity INTEGER\\n);\",\"CREATE TABLE ProductInfo (\\n product_id INTEGER,\\n category VARCHAR(100),\\n price NUMERIC(10, 2)\\n);\"],\"name\":\"find_category_recommendation_pairs\",\"pythondata\":[\"ProductPurchases = pd.DataFrame({\\n \\\"user_id\\\": pd.Series(dtype='int64'),\\n \\\"product_id\\\": pd.Series(dtype='int64'),\\n \\\"quantity\\\": pd.Series(dtype='int64')\\n})\",\"ProductInfo= pd.DataFrame({\\n \\\"product_id\\\": pd.Series(dtype='int64'),\\n \\\"category\\\": pd.Series(dtype='string'),\\n \\\"price\\\": pd.Series(dtype='float64') # Reflects NUMBER(10, 2)\\n})\"],\"database\":true,\"database_schema\":{\"ProductPurchases\":{\"user_id\":\"INT\",\"product_id\":\"INT\",\"quantity\":\"INT\"},\"ProductInfo\":{\"product_id\":\"INT\",\"category\":\"VARCHAR(100)\",\"price\":\"DECIMAL(10, 2)\"}}}", "judgerAvailable": true, "judgeType": "large", "mysqlSchemas": [ "CREATE TABLE if not exists ProductPurchases (\n user_id INT,\n product_id INT,\n quantity INT\n)", "CREATE TABLE if not exists ProductInfo (\n product_id INT,\n category VARCHAR(100),\n price DECIMAL(10, 2)\n)", "Truncate table ProductPurchases", "insert into ProductPurchases (user_id, product_id, quantity) values ('1', '101', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('1', '102', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('1', '201', '3')", "insert into ProductPurchases (user_id, product_id, quantity) values ('1', '301', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('2', '101', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('2', '102', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('2', '103', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('2', '201', '5')", "insert into ProductPurchases (user_id, product_id, quantity) values ('3', '101', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('3', '103', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('3', '301', '4')", "insert into ProductPurchases (user_id, product_id, quantity) values ('3', '401', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('4', '101', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('4', '201', '3')", "insert into ProductPurchases (user_id, product_id, quantity) values ('4', '301', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('4', '401', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('5', '102', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('5', '103', '1')", "insert into ProductPurchases (user_id, product_id, quantity) values ('5', '201', '2')", "insert into ProductPurchases (user_id, product_id, quantity) values ('5', '202', '3')", "Truncate table ProductInfo", "insert into ProductInfo (product_id, category, price) values ('101', 'Electronics', '100')", "insert into ProductInfo (product_id, category, price) values ('102', 'Books', '20')", "insert into ProductInfo (product_id, category, price) values ('103', 'Books', '35')", "insert into ProductInfo (product_id, category, price) values ('201', 'Clothing', '45')", "insert into ProductInfo (product_id, category, price) values ('202', 'Clothing', '60')", "insert into ProductInfo (product_id, category, price) values ('301', 'Sports', '75')", "insert into ProductInfo (product_id, category, price) values ('401', 'Kitchen', '50')" ], "enableRunCode": true, "envInfo": "{\"mysql\":[\"MySQL\",\"

\\u7248\\u672c\\uff1aMySQL 8.0<\\/code><\\/p>\"],\"mssql\":[\"MS SQL Server\",\"

mssql server 2019.<\\/p>\"],\"oraclesql\":[\"Oracle\",\"

Oracle Sql 11.2.<\\/p>\"],\"pythondata\":[\"Pandas\",\"

Python 3.10 with Pandas 2.2.2 and NumPy 1.26.4<\\/p>\"],\"postgresql\":[\"PostgreSQL\",\"

PostgreSQL 16<\\/p>\"]}", "book": null, "isSubscribed": false, "isDailyQuestion": false, "dailyRecordStatus": null, "editorType": "CKEDITOR", "ugcQuestionId": null, "style": "LEETCODE", "exampleTestcases": "{\"headers\":{\"ProductPurchases\":[\"user_id\",\"product_id\",\"quantity\"],\"ProductInfo\":[\"product_id\",\"category\",\"price\"]},\"rows\":{\"ProductPurchases\":[[1,101,2],[1,102,1],[1,201,3],[1,301,1],[2,101,1],[2,102,2],[2,103,1],[2,201,5],[3,101,2],[3,103,1],[3,301,4],[3,401,2],[4,101,1],[4,201,3],[4,301,1],[4,401,2],[5,102,2],[5,103,1],[5,201,2],[5,202,3]],\"ProductInfo\":[[101,\"Electronics\",100],[102,\"Books\",20],[103,\"Books\",35],[201,\"Clothing\",45],[202,\"Clothing\",60],[301,\"Sports\",75],[401,\"Kitchen\",50]]}}", "__typename": "QuestionNode" } } }