如何在Shipment_INFO表中新增显示运单商品数量的列
无需临时表的SQL实现方案
直接使用窗口函数就能一步实现需求,不需要创建临时表或额外关联操作:
SELECT ShipmentID, ItemID, COUNT(ItemID) OVER (PARTITION BY ShipmentID) AS Shipment_Size FROM Shipment_INFO;
原理说明
PARTITION BY ShipmentID:将数据按ShipmentID分组,对每个分组单独计算统计值COUNT(ItemID):因为ItemID是唯一值,统计每个分组内的ItemID数量就是该运单的商品总数- 窗口函数会把分组统计的结果映射到原表的每一行,直接生成包含
Shipment_Size列的完整报表
数据验证
原表数据:
| ShipmentID | ItemID |
|---|---|
| 10001 | 20001 |
| 10002 | 20002 |
| 10002 | 20003 |
| 10003 | 20004 |
| 10004 | 20005 |
| 10004 | 20006 |
| 10004 | 20007 |
| 10005 | 20008 |
| 10005 | 20009 |
| 10006 | 20010 |
执行上述SQL后得到的结果(与理想输出完全一致):
| ShipmentID | ItemID | Shipment_Size |
|---|---|---|
| 10001 | 20001 | 1 |
| 10002 | 20002 | 2 |
| 10002 | 20003 | 2 |
| 10003 | 20004 | 1 |
| 10004 | 20005 | 3 |
| 10004 | 20006 | 3 |
| 10004 | 20007 | 3 |
| 10005 | 20008 | 2 |
| 10005 | 20009 | 2 |
| 10006 | 20010 | 1 |
对比原思路的优势
相比先创建临时表再关联的方式,窗口函数方案更简洁,执行效率更高——避免了表关联的额外开销,尤其在数据量较大时表现更明显。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

