Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 如何从SQL Server的多个相同行和列中获取最短日期_Sql Server - Fatal编程技术网

Sql server 如何从SQL Server的多个相同行和列中获取最短日期

Sql server 如何从SQL Server的多个相同行和列中获取最短日期,sql-server,Sql Server,如上所述。如果ID、type1和type2是相同的,则为我提供最小创建日期,但前提是它们相邻且没有间隙 应该是这样的 ID Type1 Type2 Created --------------------------------------------- 1 A B 2014-01-25 00:34:32.630 1 A B 2014-01-23 00:34:31.630 1 C K 2

如上所述。如果
ID
type1
type2
是相同的,则为我提供最小创建日期,但前提是它们相邻且没有间隙

应该是这样的

ID  Type1   Type2     Created
---------------------------------------------
1    A        B       2014-01-25 00:34:32.630
1    A        B       2014-01-23 00:34:31.630
1    C        K       2014-01-22 00:34:30.630
1    Z        Y       2014-01-21 00:34:29.630
1    H        L       2014-01-20 00:34:28.630
1    H        L       2014-01-19 00:34:27.630
1    A        B       2014-01-18 00:34:26.630

祝您好运,并提前向您表示感谢

如果您的SQL Server版本足够晚,我认为您的解决方案将类似于此。一个假设是,ID中的创建日期从来没有关联。我也在读取行之间的数据,并假设可能有其他ID值需要单独处理,即使日期重叠

ID  Type1   Type2     Created
---------------------------------------------
1    A        B       2014-01-23 00:34:31.630
1    C        K       2014-01-22 00:34:30.630
1    Z        Y       2014-01-21 00:34:29.630
1    H        L       2014-01-19 00:34:27.630
1    A        B       2014-01-18 00:34:26.630
试试这个:

测试数据:

with T as (
    ID, Type1, Type2, Created
    select
        row_number() over (partition by ID order by Created) -
        -- row_number() over (order by ID, Created) /* should also work */
        row_number() over (partition by ID, Type1, Type2 order by Created) as Grp,
    from yourtable
)
select ID, Type1, Type2, min(Created)
from T
group by ID, Type1, Type2, Grp
查询:

DECLARE @t table
(ID int, Type1 char(1), Type2 char(1), Created datetime)
INSERT @t values
(1,'A','B','2014-01-25 00:34:32.630'),
(1,'A','B','2014-01-23 00:34:31.630'),
(1,'C','K','2014-01-22 00:34:30.630'),
(1,'Z','Y','2014-01-21 00:34:29.630'),
(1,'H','L','2014-01-20 00:34:28.630'),
(1,'H','L','2014-01-19 00:34:27.630'),
(1,'A','B','2014-01-18 00:34:26.630')
结果:

;WITH CTE AS
(
  SELECT 
    ID, Type1, Type2, Created,
    dense_rank() over (order by Created) rn1,
    rank() over (partition by id, type1, type2 order by Created) rn2
  FROM @t
)
SELECT ID, Type1, Type2, min(Created) Created
FROM cte
GROUP BY ID, Type1, Type2, rn1 - rn2
ORDER BY Created

谢谢各位。我现在可以交报告回家了。谢谢你一次again@Afrah你真的能回答这个问题吗?这是非常重要的creative@t-clausen.dk,我没想到今天会有人给我一个有用的答案,但谢谢你。您的CTE已解决该查询,我已反复检查,很明显该查询无法处理多个ID值。我想您想将
rn
表达式更改为:
row\u number()over(按创建的ID顺序划分)rn
@shawnt00为什么不?我将ID包括在分组中,这样应该可以正常工作。我做了一个不同的修改来处理相同的行。我必须阅读问题的字里行间的内容,甚至可以假设在这个问题中还有其他ID值。但这种情况下的问题是,如果/当从其他id创建的日期交错时,它会抛出行编号。@shawnt00我在示例中复制了数据,并使用id 2和3。我得到了我所期望的结果。可能是顺序让您感到困惑更改为密集排列有助于掩盖问题,因为您只是用新ID复制了相同的创建值。如果你还想检查一下,那么试着增加日期,这样他们就不会在排名中处于平局。
ID  Type1  Type2  Created
1   A      B      2014-01-18 00:34:26.630
1   H      L      2014-01-19 00:34:27.630
1   Z      Y      2014-01-21 00:34:29.630
1   C      K      2014-01-22 00:34:30.630
1   A      B      2014-01-23 00:34:31.630