SQL Server:要在每个(PARTITION BY..)元素上循环的过程或函数



我正在通过实际示例学习SQL语法。我有下表:

CREATE TABLE [dbo].[Orders_tmp_test]
(
department_id VARCHAR(4),
rank_pr_co INT,
starting_date DATE, 
end_date DATE
)

INSERT INTO [dbo].[Orders_tmp_test]
SELECT '1001', 1, '2019/04/01', '2020/02/01'
UNION ALL    
SELECT '1001', 2, '2020/01/31', '2020/04/30'
UNION ALL     
SELECT '1001', 3, '2020/03/01', '2020/03/01'
UNION ALL     
SELECT '1001', 4, '2020/03/31', '2020/05/31'
UNION ALL     
SELECT '1002', 1, '2019/03/01', '2020/02/01'
UNION ALL    
SELECT '1002', 2, '2020/01/01', '2020/04/01'

每个部门都有几个项目。项目按";rank_pr_co";。当当前项目尚未结束,但给定部门的另一个项目已经开始时,称为冲突。我想修改";starting_ date";以及";end_ date";将解决所有冲突的项目。项目的长度是固定的。对于其中";starting_ date"="end_ date";我想让它们保持原样。在这种情况下,我想解决前一个项目和下一个项目之间的冲突。

最后我想要下表:

'1001', 1, '2019/04/01', '2020/02/01'
'1001', 2, '2020/02/01', '2020/05/01'
'1001', 3, '2020/03/01', '2020/03/01'
'1001', 4, '2020/05/01', '2020/07/01'
'1002', 1, '2019/03/01', '2020/02/01'
'1002', 2, '2020/02/01', '2020/05/01'

我试图创建标量函数并将其强制转换到(partitionby…(元素上,但它不起作用,并返回错误:

Msg 4113,Level 16,State 1,Line 3
函数"dbo.ideal_schema"不是有效的窗口函数,不能与OVER子句一起使用。

有人知道如何导出最终表吗?

如果您希望项目中没有重叠的日期,并且结束日期不包含在内,那么只需使用lead():

select t.*,
lead(end_date, 1, end_date) over (partition by project_id order by start_date) as imputed_end_date
from Orders_tmp_test t;

注意:这不是故意使用排序列。在日期和指定顺序相互无关的边缘情况下,您必须有更多关于该怎么办的解释。

注意:如果您真的想update表,可以很容易地将其合并到update语句中。我认为没有理由为此编写用户定义函数。如果在查询表时希望此信息可用,则可能需要视图。

最新更新