【发布时间】:2019-01-09 12:33:16
【问题描述】:
我希望能够通过一个材料移动表、用于移动它的设备和时间来追溯,从一个字段中的指定值开始,然后在不同行的另一个字段中找到该值共享价值。
在下表中,我需要能够追溯,例如,从 EndCode 'M' 所有相关行一直追溯到 StartCode A。然后我可能希望能够追溯所有从 EndCode 'U' 返回到 StartCode 'N' 的行。
在表格中,StartCode(材料)A 和 B 移动成为 EndCode C。EndCode C 然后成为 StartCodeD,然后与 StartCode E 一起移动成为 EndCode F 等等。橙色/蓝色行代表材料移动组。
据此,我想创建一个新的表/视图,它将下一个事件的 StartedAt 时间作为一个名为“EndedAt”的新字段。它看起来像这样:
我创建了一个递归查询,它使用 ROW_NUMBER 和 CTE 将 StartedAt 作为新字段作为“EndedAt”引入。
然后,我尝试使用嵌套的 SELECT 语句查找与 EndCode 'M' 相关的所有 StartCode,以尝试环回表以在 StartCode 列中搜索所有相关的 EndCode。这只会带来几行。我害怕重复嵌套语句几次,它会通过不同的行。
我需要帮助来获取创建所需表/视图所需的所有相关开始/结束代码。
最终会在表格中附加一份报告,允许表格可以通过所选的 EndCode 参数(例如 M、U 等)进行过滤
CREATE TABLE MyTable (
`StartCode` VARCHAR(1),
`StartedAt` DATETIME,
`EndCode` VARCHAR(1)
);
INSERT INTO MyTable (`StartCode`, `StartedAt`, `EndCode`)
VALUES
('A', '01/01/2019 01:00', 'C'),
('B', '01/01/2019 02:15', 'C'),
('C', '01/01/2019 03:00', 'F'),
('D', '01/01/2019 03:19', 'F'),
('E', '01/01/2019 04:00', 'F'),
('F', '01/01/2019 04:14', 'G'),
('G', '01/01/2019 05:00', 'J'),
('H', '01/01/2019 05:37', 'J'),
('I', '01/01/2019 05:45', 'J'),
('J', '01/01/2019 06:00', 'L'),
('K', '01/01/2019 06:09', 'L'),
('L', '01/01/2019 07:00', 'M'),
('N', '01/01/2019 09:20', 'P'),
('O', '01/01/2019 09:37', 'P'),
('P', '01/01/2019 09:45', 'Q'),
('Q', '01/01/2019 11:00', 'T'),
('R', '01/01/2019 11:10', 'T'),
('S', '01/01/2019 11:47', 'T'),
('T', '01/01/2019 11:58', 'U');
【问题讨论】:
-
最好将您的示例数据提供为
formatted text,或者更好的是,在 sql fiddle 中。这让我们更容易为您提供帮助。 -
EndedAt 列是一个简单直接的连接(不需要递归也不需要 CTE)。对于 M 到 A,如果您可以发布完整的 DML 和 DDL 示例,我可以为您提供帮助。还要删除存储桶列,因为它们对您的问题并不重要。
-
请从层次关系中指定您想要的确切输出。
-
好的,用过 SL Fiddle,见编辑。谢谢:)
标签: sql-server loops recursive-query row-number ssms-2017