Sql server 将数据集拆分到windows中,并在tsql中从该窗口获取最小值
我很难将一个数据集拆分为几个其他数据集,以便从中获取最小值。此项的基线:键可以在不同的国家/地区同时使用(国家/地区id在a列中)。一个键(图中的列b)可以在一段时间后再次使用,在本例中为120天。一个键可以包含大约10个事件和日期 我试着做的事情是,取整个集合的第一个日期,对a和b列进行分区,并使用Sql server 将数据集拆分到windows中,并在tsql中从该窗口获取最小值,sql-server,tsql,split,Sql Server,Tsql,Split,我很难将一个数据集拆分为几个其他数据集,以便从中获取最小值。此项的基线:键可以在不同的国家/地区同时使用(国家/地区id在a列中)。一个键(图中的列b)可以在一段时间后再次使用,在本例中为120天。一个键可以包含大约10个事件和日期 我试着做的事情是,取整个集合的第一个日期,对a和b列进行分区,并使用datediff()获得整个集合的最小日期和每个单独事件之间的天数。然后使用datediff/120返回的数字对它们进行分组。我真正想做的是取每一组(而不是整组)的最小日期,然后根据它进行计算。我
datediff()
获得整个集合的最小日期和每个单独事件之间的天数。然后使用datediff/120返回的数字对它们进行分组。我真正想做的是取每一组(而不是整组)的最小日期,然后根据它进行计算。我真的希望我解释得足够清楚,让你们这些好心的助手明白我的目的。现在我想到。。我有点担心,即使我得到了单个集合的最小日期,然后除以120,我也会得到错误的结果。任何建议,谢谢
我使用了这样的东西:DATEDIFF(d,min(日期)OVER(被a,b分割),dates)/120
这似乎是一个很好的例子。下面的代码递归地查找每个集合,每个递归增加120天
SET DATEFORMAT YMD
DECLARE @SampleData TABLE( A INT,
B NVARCHAR(25),
C DATETIME)
INSERT INTO @SampleData(A, B, C)
VALUES (2,'093123124', CONVERT(DATETIME, '2015-04-16')),
(2,'093123124', CONVERT(DATETIME, '2015-04-16')),
(2,'093123124', CONVERT(DATETIME, '2015-04-17')),
(2,'093123124', CONVERT(DATETIME, '2015-04-17')),
(2,'093123124', CONVERT(DATETIME, '2015-11-24')),
(2,'093123124', CONVERT(DATETIME, '2015-11-24')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2016-04-17')),
(2,'093123124', CONVERT(DATETIME, '2016-04-18')),
(2,'093123124', CONVERT(DATETIME, '2016-04-20')),
(2,'093123124', CONVERT(DATETIME, '2016-04-21')),
-- (2,'093123124', CONVERT(DATETIME, '2016-03-24')),
(2,'093123124', CONVERT(DATETIME, '2016-04-22'));
WITH lvl1
AS
(
SELECT A,
B,
C = MIN(C)
FROM @SampleData
GROUP BY A,
B
),
lvlOthers
AS
(
SELECT A,
B,
C
FROM lvl1
UNION ALL
SELECT S.A,
S.B,
C = MIN(S.C) OVER(PARTITION BY S.A, S.B)
FROM lvlOthers
INNER JOIN @SampleData AS S ON lvlOthers.A = S.A
AND lvlOthers.B = S.B
AND S.C > DATEADD(DAY, 120, lvlOthers.C)
)
SELECT DISTINCT A, B, C
FROM lvlOthers
OPTION (MAXRECURSION 100)
Beaware指出,此代码没有针对性能进行微调。事实上,它在大型数据集上的性能很差
此外,如果日期范围超过~32年,则应增加maxrecursion 这似乎是一个很好的例子。下面的代码递归地查找每个集合,每个递归增加120天
SET DATEFORMAT YMD
DECLARE @SampleData TABLE( A INT,
B NVARCHAR(25),
C DATETIME)
INSERT INTO @SampleData(A, B, C)
VALUES (2,'093123124', CONVERT(DATETIME, '2015-04-16')),
(2,'093123124', CONVERT(DATETIME, '2015-04-16')),
(2,'093123124', CONVERT(DATETIME, '2015-04-17')),
(2,'093123124', CONVERT(DATETIME, '2015-04-17')),
(2,'093123124', CONVERT(DATETIME, '2015-11-24')),
(2,'093123124', CONVERT(DATETIME, '2015-11-24')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2015-11-25')),
(2,'093123124', CONVERT(DATETIME, '2016-04-17')),
(2,'093123124', CONVERT(DATETIME, '2016-04-18')),
(2,'093123124', CONVERT(DATETIME, '2016-04-20')),
(2,'093123124', CONVERT(DATETIME, '2016-04-21')),
-- (2,'093123124', CONVERT(DATETIME, '2016-03-24')),
(2,'093123124', CONVERT(DATETIME, '2016-04-22'));
WITH lvl1
AS
(
SELECT A,
B,
C = MIN(C)
FROM @SampleData
GROUP BY A,
B
),
lvlOthers
AS
(
SELECT A,
B,
C
FROM lvl1
UNION ALL
SELECT S.A,
S.B,
C = MIN(S.C) OVER(PARTITION BY S.A, S.B)
FROM lvlOthers
INNER JOIN @SampleData AS S ON lvlOthers.A = S.A
AND lvlOthers.B = S.B
AND S.C > DATEADD(DAY, 120, lvlOthers.C)
)
SELECT DISTINCT A, B, C
FROM lvlOthers
OPTION (MAXRECURSION 100)
Beaware指出,此代码没有针对性能进行微调。事实上,它在大型数据集上的性能很差
此外,如果日期范围超过~32年,则应增加maxrecursion 如果您将数据发布为文本,则更好,我们无法从图片复制粘贴。向我们显示数据库模式、示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。添加数据作为文本,以便更容易复制,以及预期结果。谢谢你的提示。起初看起来像是一个独特的。。。但是我不理解你的欲望输出的逻辑。去哪里
11-25
?另外,不要使用a、b、c
使用有意义的变量名称,您需要解释您的逻辑。什么是一套?给我们展示一些例子。我创建了一个我需要实现的可视化表示。包括一个例子。这是最详细的。如果您将数据发布为文本,则更好,我们无法从图片复制粘贴。向我们显示数据库模式、示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。添加数据作为文本,以便更容易复制,以及预期结果。谢谢你的提示。起初看起来像是一个独特的。。。但是我不理解你的欲望输出的逻辑。去哪里11-25
?另外,不要使用a、b、c
使用有意义的变量名称,您需要解释您的逻辑。什么是一套?给我们展示一些例子。我创建了一个我需要实现的可视化表示。包括一个例子。这是最详细的。令人惊叹的!这正是我走上正轨所需要的。太棒了!这正是我走上正轨所需要的。