DB2中如何将同一ID的多行投递偏好合并为单行(含主次字段)
合并用户投递偏好记录方案
针对同一用户ID对应多行投递偏好的问题,可通过窗口函数+条件聚合的方式将多行合并为一行,保留首次出现的投递方式为主方式,第二次出现的为次要方式,具体实现如下:
假设你的数据表名为user_preferences,字段包含ID、First_Name、Last_Name、Preference。
通用SQL方案(适用于MySQL、PostgreSQL、SQL Server等支持窗口函数的数据库)
SELECT ID, First_Name, Last_Name, MAX(CASE WHEN rn = 1 THEN Preference END) AS Primary_Method, MAX(CASE WHEN rn = 2 THEN Preference END) AS Secondary_Method FROM ( -- 为每个ID下的投递偏好按存储顺序编号 SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS rn FROM user_preferences ) t GROUP BY ID, First_Name, Last_Name;
说明:
- 子查询中
ROW_NUMBER()函数按ID分组,为每组内的记录编号;ORDER BY (SELECT NULL)表示沿用数据库存储的自然顺序,若有明确的记录时间字段(如create_time),建议替换为该字段以保证排序准确性。 - 外层通过条件聚合,将编号为1的偏好设为
Primary_Method,编号为2的设为Secondary_Method,并通过GROUP BY合并同一ID的所有行。 - 若部分用户仅有一种投递方式,
Secondary_Method会返回NULL,可按需用COALESCE(MAX(CASE ...), '无')替换为自定义默认值。
SQL Server专属PIVOT方案
SELECT ID, First_Name, Last_Name, [1] AS Primary_Method, [2] AS Secondary_Method FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS rn FROM user_preferences ) t PIVOT ( MAX(Preference) FOR rn IN ([1], [2]) ) p;
内容的提问来源于stack exchange,提问作者J123
相关产品推荐
相关产品推荐

