编写SQL语句识别按商品(UID)分组的价格变更记录行
识别价格变化的商品记录SQL方案
针对你手头的水果商品数据表需求——找出存在价格变化的记录并按UID分组,这里提供几个实用的SQL实现方法:
方法1:先筛选有价格变化的商品,再列出所有相关记录
这个方法先定位所有出现过价格变动的UID,再关联原表获取这些商品的全量记录,方便查看完整的价格时间线:
WITH price_variations AS ( SELECT UID, COUNT(DISTINCT Price) AS distinct_price_count FROM your_table_name -- 替换成你的实际表名 GROUP BY UID HAVING COUNT(DISTINCT Price) > 1 -- 筛选价格数大于1的商品(即有变化) ) SELECT t.Table_ID, t.Date, t.UID, t.Fruit, t.Variety, t.Price FROM your_table_name t INNER JOIN price_variations pv ON t.UID = pv.UID ORDER BY t.UID, t.Date; -- 按商品和日期排序,清晰展示价格变化顺序
方法2:给每条记录标记价格变化状态
用窗口函数直接在每条记录上标注该商品是否有价格变化,以及当前价格是否为调整后的价格:
SELECT Table_ID, Date, UID, Fruit, Variety, Price, -- 标记该商品是否存在价格变动 CASE WHEN COUNT(DISTINCT Price) OVER (PARTITION BY UID) > 1 THEN '存在价格变化' ELSE '无价格变化' END AS price_change_status, -- 标记当前价格是否与该商品首次录入价格不同 CASE WHEN Price <> FIRST_VALUE(Price) OVER (PARTITION BY UID ORDER BY Date) THEN '调整后价格' ELSE '原始价格' END AS price_type FROM your_table_name ORDER BY UID, Date;
方法3:直接显示价格发生变化的具体记录
如果只需要看到价格变动的那几行(比如从原始价调到新价格的记录),可以用LAG函数获取上一次的价格,筛选出价格不同的行:
WITH ranked_price_records AS ( SELECT *, -- 获取同一UID下上一条记录的价格(按日期排序) LAG(Price) OVER (PARTITION BY UID ORDER BY Date) AS previous_price FROM your_table_name ) SELECT Table_ID, Date, UID, Fruit, Variety, Price AS current_price, previous_price, Price - previous_price AS price_difference -- 计算价格变动幅度 FROM ranked_price_records WHERE previous_price IS NOT NULL -- 排除第一条无历史价格的记录 AND Price <> previous_price -- 只保留价格变化的行 ORDER BY UID, Date;
注意事项
- 替换代码中的
your_table_name为你实际使用的表名 - 如果日期字段的格式需要转换,可能需要用
CAST(Date AS DATE)确保排序正确 - 若存在同一UID同一天多次调价的情况,上述方法依然有效,因为是按UID分组并按日期排序
内容的提问来源于stack exchange,提问作者JackBurton
相关产品推荐
相关产品推荐

