gpt4 book ai didi

sql-server - 如何确定 sql server 2008 中的全局和局部最小值和最大值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:47 28 4
gpt4 key购买 nike

我正在尝试找出确定数据集的全局和局部最小值和最大值的最佳方法。我认为一定有一种简单的方法可以做到这一点,但我想不出来。

我正在使用 SQL Server 2008。

假设我有一个用户订阅日期的数据集。

Start Date      Stop Date       PersonID
12/31/2007 3/31/2008 1
3/31/2008 6/30/2008 1
6/30/2008 9/30/2008 1
2/28/2008 3/31/2008 2
3/31/2008 4/30/2008 2
7/31/2008 8/31/2008 2
5/31/2008 6/30/2008 3

我知道其中有些日期是每季度一次,有些是每月一次。

最终结果应该是:

StartDate      StopDate      PersonID
12/31/2007 9/30/2008 1
2/28/2008 4/30/2008 2
7/31/2008 8/31/2008 2
5/31/2008 6/30/2008 3

我只是想找到所有可能的连续段,并且在没有循环或游标的情况下执行此操作。

有什么想法吗?

最佳答案

如果您不介意使用 CTE , 以下脚本会产生您想要的结果。

测试数据

DECLARE @Users TABLE (
PersonID INTEGER
, StartDate DATETIME
, StopDate DATETIME
)

INSERT INTO @Users
SELECT 1, '12-31-2007', '3-31-2008'
UNION ALL SELECT 1, '3-31-2008','6-30-2008'
UNION ALL SELECT 1, '6-30-2008','9-30-2008'
UNION ALL SELECT 2, '2-28-2008','3-31-2008'
UNION ALL SELECT 2, '3-31-2008','4-30-2008'
UNION ALL SELECT 2, '7-31-2008','8-31-2008'
UNION ALL SELECT 3, '5-31-2008','6-30-2008'

SQL语句

;WITH q AS (
SELECT PersonID, StartDate, StopDate
FROM @Users
UNION ALL
SELECT u.PersonId, q.StartDate, u.StopDate
FROM q
INNER JOIN @Users u ON u.PersonID = q.PersonID
AND u.StartDate = q.StopDate
)
SELECT PersonID, MIN(StartDate), StopDate
FROM (
SELECT PersonID, StartDate, [StopDate] = MAX(StopDate)
FROM q
GROUP BY
PersonID, StartDate
) p
GROUP BY
PersonID, StopDate
ORDER BY
PersonID, 2, 3

关于sql-server - 如何确定 sql server 2008 中的全局和局部最小值和最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3709242/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com