SQL技术实现:基于Field_ID将Date列拆分为起止日期列
解决方案:将日期列按Field_ID拆分为起始/结束日期列
这是个很常见的行转列需求,我给你两种实用的SQL实现方法,覆盖不同数据库的兼容性需求:
方法一:条件聚合(全数据库通用)
这种写法兼容性拉满,不管你用MySQL、PostgreSQL还是SQL Server都能跑通:
SELECT Extender_Record_ID, MAX(CASE WHEN Field_ID = 100 THEN Date END) AS Start_Date, MAX(CASE WHEN Field_ID = 101 THEN Date END) AS End_Date FROM Your_Table_Name -- 记得替换成你的实际表名 GROUP BY Extender_Record_ID ORDER BY Extender_Record_ID;
简单解释:
- 以
Extender_Record_ID分组,确保每组对应一对起始/结束日期 CASE WHEN会精准筛选出对应Field_ID的日期值,用MAX()(或MIN()都行,因为每组里每个Field_ID只有一条记录)把值聚合起来- 最后排序保证结果顺序和你期望的一致
方法二:PIVOT函数(适用于支持该语法的数据库)
如果你的数据库是SQL Server、Oracle这类支持PIVOT的,可以用更简洁的写法:
SELECT Extender_Record_ID, [100] AS Start_Date, [101] AS End_Date FROM Your_Table_Name PIVOT ( MAX(Date) FOR Field_ID IN ([100], [101]) ) AS Pivot_Result ORDER BY Extender_Record_ID;
简单解释:
- PIVOT会直接把
Field_ID的不同值(100和101)转成列 - 同样用
MAX(Date)聚合每组的日期,最后给列重命名成你需要的Start_Date和End_Date
最终结果示例
执行任意一种SQL后,你会得到这样的结果:
| Extender_Record_ID | Start_Date | End_Date |
|---|---|---|
| 1 | 1/1/2018 | 1/2/2018 |
| 2 | 1/14/2018 | 1/15/2018 |
| 3 | 2/1/2018 | 2/3/2018 |
| 4 | 2/15/2018 | 2/17/2018 |
| 5 | 3/2/2018 | 3/5/2018 |
要是你只需要单独提取Start Date或End Date的列表,只在SELECT里保留对应列就行。
内容的提问来源于stack exchange,提问作者Cliff
相关产品推荐
相关产品推荐

