#2253
Hard Database Dynamic unpivoting of a table
Database
69.3% acceptance
Mar 31, 2026
20
13
No description available.
Solution
Pandas
Time O(1)
Space O(1)
# Table: Products
#
# +-------------+---------+
# | Column Name | Type |
# +-------------+---------+
# | product_id | int |
# | store_name1 | int |
# | store_name2 | int |
# | : | int |
# | : | int |
# | : | int |
# | store_namen | int |
# +-------------+---------+
# product_id is the primary key for this table.
# Each row in this table indicates the product's price in n different stores.
# If the product is not available in a store, the price will be null in that store's column.
# The names of the stores may change from one testcase to another. There will be at least 1 store and at most 30 stores.
#
#
#
# Important note: This problem targets those who have a good experience with SQL. If you are a beginner, we recommend that you skip it for now.
#
# Implement the procedure UnpivotProducts to reorganize the Products table so that each row has the id of one product, the name of a store where it is sold, and its price in that store. If a product is not available in a store, do not include a row with that product_id and store combination in the result table. There should be three columns: product_id, store, and price.
#
# The procedure should return the table after reorganizing it.
#
# Return the result table in any order.
#
# The query result format is in the following example.
#
# Example 1:
# Input:
# Products table:
# +------------+----------+--------+------+------+
# | product_id | LC_Store | Nozama | Shop | Souq |
# +------------+----------+--------+------+------+
# | 1 | 100 | null | 110 | null |
# | 2 | null | 200 | null | 190 |
# | 3 | null | null | 1000 | 1900 |
# +------------+----------+--------+------+------+
# Output:
# +------------+----------+-------+
# | product_id | store | price |
# +------------+----------+-------+
# | 1 | LC_Store | 100 |
# | 1 | Shop | 110 |
# | 2 | Nozama | 200 |
# | 2 | Souq | 190 |
# | 3 | Shop | 1000 |
# | 3 | Souq | 1900 |
# +------------+----------+-------+
# Explanation:
# Product 1 is sold in LC_Store and Shop with prices of 100 and 110 respectively.
# Product 2 is sold in Nozama and Souq with prices of 200 and 190.
# Product 3 is sold in Shop and Souq with prices of 1000 and 1900.
import pandas as pd
def find_valid_users(products: pd.DataFrame) -> pd.DataFrame:
store_cols = [c for c in products.columns if c != 'product_id']
result = products.melt(id_vars='product_id', value_vars=store_cols, var_name='store', value_name='price')
result = result.dropna(subset=['price'])
return result[['product_id', 'store', 'price']]