Sql 选择一个选项,将特定值之间的所有行关联起来

Sql 选择一个选项,将特定值之间的所有行关联起来,sql,sql-server,Sql,Sql Server,我在表中有一列包含以下示例数据: 20170426-31974-B 20170426-31980 20170426-32014 20170426-32609 20170426-32069-B 20170426-32649 20170426-32659 20170426-32669-B 20170426-32849 带-B的值是参考值。所有其他文件(不带-B)都应该有一个与关联的引用文件。因此,引用(-B)之间的所有间隙都应该与前面的“-B”相关联 是否通过查询将行与引用“-B”关联 我的意

我在表中有一列包含以下示例数据:

20170426-31974-B
20170426-31980
20170426-32014
20170426-32609
20170426-32069-B
20170426-32649
20170426-32659
20170426-32669-B
20170426-32849
带-B的值是参考值。所有其他文件(不带-B)都应该有一个与关联的引用文件。因此,引用(-B)之间的所有间隙都应该与前面的“-B”相关联

  • 是否通过查询将行与引用“-B”关联
我的意思是:

20170426-31980 -> reference to 20170426-31974-B
20170426-32014 -> reference to 20170426-31974-B
20170426-32609 -> reference to 20170426-31974-B
20170426-32649 -> reference to 20170426-32069-B
20170426-32659 -> reference to 20170426-32069-B
20170426-32849 -> refence to 20170426-32669-B
换句话说,我需要获取-B之间的所有文件。所有这些文件都应该与之前的-B相关联

select应该返回如下内容

20170426-31980 || 20170426-31974-B
20170426-32014 || 20170426-31974-B
20170426-32609 || 20170426-31974-B
20170426-32649 || 20170426-32069-B
20170426-32659 || 20170426-32069-B
20170426-32849 || 20170426-32669-B
我试过:

但我相信我的逻辑是错误的。我应该尝试使用游标而不是查询吗


经过一些评论后,顺序很重要。这些名称是根据时间创建的。文件的第一部分是yearmonthday秒。我的问题是每个文件都应该有一个引用(-B)。如何知道哪些文件与-B关联?它是参考文件之间的日期

20170426-31974-B.csv
20170426-31980.csv
20170426-31987.csv
20170426-31994.csv
20170426-32004.csv
20170426-32014.csv
20170426-32069-B.csv
20170426-32073.csv
20170426-32079.csv
20170426-32639.csv
20170426-32659.csv
20170426-32669-B.csv
20170426-32674.csv  
在这种情况下,我有我的第一个参考20170426-31974-B.csv。在到达第二个引用之前,所有即将到来的文件(按时间顺序)都应该指向第一个引用

  • 参考1=20170426-31974-B.csv
  • 与关联的值

    20170426-31980.csv
    20170426-31987.csv
    20170426-31994.csv
    20170426-32004.csv
    20170426-32014.csv
    
    20170426-32674.csv
    
  • 参考2=20170426-32069-B.csv
  • 价值观与

    20170426-32073.csv
    20170426-32079.csv
    20170426-32639.csv
    20170426-32659.csv
    
  • 参考3:20170426-32669-B.csv
  • 与关联的值

    20170426-31980.csv
    20170426-31987.csv
    20170426-31994.csv
    20170426-32004.csv
    20170426-32014.csv
    
    20170426-32674.csv
    

    根据描述,我想这就是你要找的

    IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
    DROP TABLE #TestData;
    
    CREATE TABLE #TestData (
        SomeValue VARCHAR(20) NOT NULL PRIMARY KEY CLUSTERED
        );
    INSERT #TestData (SomeValue) VALUES 
        ('20170426-31974-B.csv'),
        ('20170426-31980.csv'),
        ('20170426-32014.csv'),
        ('20170426-32609.csv'),
        ('20170426-32069-B.csv'),
        ('20170426-32649.csv'),
        ('20170426-32659.csv'),
        ('20170426-32669-B.csv'),
        ('20170426-32849.csv');
    
    -- SELECT * FROM #TestData td;
    
    --==================================
    
    WITH 
        cte_BaseStarts AS (
            SELECT 
                td.SomeValue,
                BaseValue = IIF(RIGHT(td.SomeValue, 5) = 'B.csv', td.SomeValue, NULL)
            FROM 
                #TestData td
            ),
        cte_FillAssocBase AS (
            SELECT 
                bs.SomeValue,
                AssocBaseValue = MAX(bs.BaseValue) OVER (ORDER BY bs.SomeValue ASC)
            FROM 
                cte_BaseStarts bs
            )
    SELECT 
        fab.SomeValue,
        fab.AssocBaseValue
    FROM 
        cte_FillAssocBase fab
    WHERE 
        fab.SomeValue NOT LIKE '%B.csv';
    

    根据描述,我想这就是你要找的

    IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
    DROP TABLE #TestData;
    
    CREATE TABLE #TestData (
        SomeValue VARCHAR(20) NOT NULL PRIMARY KEY CLUSTERED
        );
    INSERT #TestData (SomeValue) VALUES 
        ('20170426-31974-B.csv'),
        ('20170426-31980.csv'),
        ('20170426-32014.csv'),
        ('20170426-32609.csv'),
        ('20170426-32069-B.csv'),
        ('20170426-32649.csv'),
        ('20170426-32659.csv'),
        ('20170426-32669-B.csv'),
        ('20170426-32849.csv');
    
    -- SELECT * FROM #TestData td;
    
    --==================================
    
    WITH 
        cte_BaseStarts AS (
            SELECT 
                td.SomeValue,
                BaseValue = IIF(RIGHT(td.SomeValue, 5) = 'B.csv', td.SomeValue, NULL)
            FROM 
                #TestData td
            ),
        cte_FillAssocBase AS (
            SELECT 
                bs.SomeValue,
                AssocBaseValue = MAX(bs.BaseValue) OVER (ORDER BY bs.SomeValue ASC)
            FROM 
                cte_BaseStarts bs
            )
    SELECT 
        fab.SomeValue,
        fab.AssocBaseValue
    FROM 
        cte_FillAssocBase fab
    WHERE 
        fab.SomeValue NOT LIKE '%B.csv';
    
    试一试

    试一试



    您的预期输出是什么?我遗漏了一些东西-20170426-31980与20170426-31974-B的关系如何?根据顺序显示。反向工作。。。32849关联到32669-b,因为它在b之后。32649和32659关联到32069-b,因为它们在b之后,在下一个-b之前,所以订单很重要。那么问题就变成了我们如何表示秩序?@Jamiec,我需要与前面的“-B”关联的“-B”之间的名称间隔。他们之间没有关系。当我找到a-B时,所有未来的值都应该与这个-B关联。@xQbert,顺序实际上并不重要,因为我确实有另一个字段(带有日期)与“order by”一起使用.您的预期输出是什么?我遗漏了一些东西-20170426-31980与20170426-31974-B的关系如何?根据顺序显示。反向工作。。。32849关联到32669-b,因为它在b之后。32649和32659关联到32069-b,因为它们在b之后,在下一个-b之前,所以订单很重要。那么问题就变成了我们如何表示秩序?@Jamiec,我需要与前面的“-B”关联的“-B”之间的名称间隔。他们之间没有关系。当我找到a-B时,所有的未来值都应该与这个-B关联。@xQbert,顺序实际上并不重要,因为我确实有另一个字段(带有日期)与“order by”一起使用。需要排除B到B的关联。当我认为只有6个好的电话时,你的结果中有9个记录。。。我已经更新了我的答案。看起来OP已经更新了示例数据,将“.csv”附加到每个值中。代码也被更新以适应这一点。杰森,它工作了!这两个答案都非常有效。我将学习两者并使用其中一种。我标记为更正的第一个,因为它是张贴之前,但你的工作也!谢谢你很乐意帮忙需要排除b到b关联。当我认为只有6个好的电话时,你的结果中有9个记录。。。我已经更新了我的答案。看起来OP已经更新了示例数据,将“.csv”附加到每个值中。代码也被更新以适应这一点。杰森,它工作了!这两个答案都非常有效。我将学习两者并使用其中一种。我标记为更正的第一个,因为它是张贴之前,但你的工作也!谢谢你很乐意帮忙如果家长没有孩子并且需要显示孩子,则可能需要左连接+1否则。不过最好避免硬编码的文件名(怀疑在使用时是否会命中日期,所以仍然是+1)。让我留待OP自行决定,如果父母没有孩子,而这些孩子需要显示,则可能需要左连接+1否则。不过最好避免硬编码的文件名(怀疑在使用时是否会命中日期,所以仍然是+1)。让我来决定吧