Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将数据集拆分到windows中,并在tsql中从该窗口获取最小值_Sql Server_Tsql_Split - Fatal编程技术网

Sql server 将数据集拆分到windows中,并在tsql中从该窗口获取最小值

Sql server 将数据集拆分到windows中,并在tsql中从该窗口获取最小值,sql-server,tsql,split,Sql Server,Tsql,Split,我很难将一个数据集拆分为几个其他数据集,以便从中获取最小值。此项的基线:键可以在不同的国家/地区同时使用(国家/地区id在a列中)。一个键(图中的列b)可以在一段时间后再次使用,在本例中为120天。一个键可以包含大约10个事件和日期 我试着做的事情是,取整个集合的第一个日期,对a和b列进行分区,并使用datediff()获得整个集合的最小日期和每个单独事件之间的天数。然后使用datediff/120返回的数字对它们进行分组。我真正想做的是取每一组(而不是整组)的最小日期,然后根据它进行计算。我

我很难将一个数据集拆分为几个其他数据集,以便从中获取最小值。此项的基线:键可以在不同的国家/地区同时使用(国家/地区id在a列中)。一个键(图中的列b)可以在一段时间后再次使用,在本例中为120天。一个键可以包含大约10个事件和日期

我试着做的事情是,取整个集合的第一个日期,对ab列进行分区,并使用
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
使用有意义的变量名称,您需要解释您的逻辑。什么是一套?给我们展示一些例子。我创建了一个我需要实现的可视化表示。包括一个例子。这是最详细的。令人惊叹的!这正是我走上正轨所需要的。太棒了!这正是我走上正轨所需要的。