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。在到达第二个引用之前,所有即将到来的文件(按时间顺序)都应该指向第一个引用
20170426-31980.csv
20170426-31987.csv
20170426-31994.csv
20170426-32004.csv
20170426-32014.csv
20170426-32674.csv
20170426-32073.csv
20170426-32079.csv
20170426-32639.csv
20170426-32659.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)。让我来决定吧