同一张表上的多个连接:转换状态

Posted

技术标签:

【中文标题】同一张表上的多个连接:转换状态【英文标题】:Multiple joins on the same table: transition statuses 【发布时间】:2020-12-14 18:07:42 【问题描述】:

我有一个 T-SQL 表,其中有许多转换状态。对于每个转换对(AVA_FROM -> AVA_TO)都有一个时间戳,我应该计算从状态到状态的每个持续时间。我不知道如何根据需要编写 SQL 脚本。

我在 SQL Fiddle 中创建表的语句下面写了。 AVA_TO = R-PC 中值的每条记录都是工作开始,而 AVA_FROM = R-PC 中值的每条记录都是工作停止。所有具有相同AVA_PRIMARYID 的记录属于同一个工单,因此需要将它们相加。你能帮我解决这个问题吗?

CREATE TABLE R5AUDVALUES 
(
    AVA_PRIMARYID nvarchar(8),
    AVA_FROM nvarchar(8),
    AVA_TO nvarchar(8),
    AVA_CHANGED datetime,
    AVA_UPDATED nvarchar(1)
);

INSERT INTO R5AUDVALUES (AVA_PRIMARYID, AVA_FROM, AVA_TO, AVA_CHANGED, AVA_UPDATED) 
VALUES ('44730', 'Q', 'R-PC', '2020-12-14 12:00:00', '+'),
       ('44730', 'R-PC', 'SSP4', '2020-12-14 12:15:00', '+'),
       ('44730', 'SSP4', 'R-PC', '2020-12-14 12:30:00', '+'),
       ('44730', 'R-PC', 'SSP5', '2020-12-14 12:45:00', '+'),
       ('44730', 'SSP5', 'R-PC', '2020-12-14 13:00:00', '+'),
       ('44730', 'R-PC', 'C', '2020-12-14 13:15:00', '+')

结果应该如下所示:

WorkOrder, WorkStart,            WorkStop 
'44730',   2020-12-14 12:00:00', '2020-12-14 12:15:00',
'44730',   2020-12-14 12:30:00', '2020-12-14 12:45:00',
'44730',   2020-12-14 13:00:00', '2020-12-14 13:15:00'

【问题讨论】:

编辑您的问题并显示您想要的结果。 也许lead函数可以帮到你。 【参考方案1】:

如果数据集是常规的,那么只需 row_number() 并加入。

with c as (
  select AVA_PRIMARYID, AVA_FROM, AVA_TO, AVA_CHANGED, AVA_UPDATED, row_number()over (order by AVA_CHANGED) n
  from R5AUDVALUES
 )
 select a.*, b.AVA_CHANGED, datediff(minute, a.AVA_CHANGED, b.AVA_CHANGED) minutes
 from c a
 join c b on a.n+1 = b.n and a.AVA_TO = 'R-PC' and  b.AVA_FROM = 'R-PC'

否则您可能需要先执行数据清理步骤。

db<>Fiddle

【讨论】:

谢谢,它有效,但我还有 2 个问题:“with”语句在我的报告引擎和 row_number() 上也不起作用。在我的报告引擎中有一个“图形”“运行计数”,但我不知道是否相同。 @over,用特定标签标记您的问题。我的解决方案是sql-server 好的,我的数据库是 sql-server,它可以在 SQL Fiddle 中正常运行,但由于某些奇怪的原因,“with”语句在我的报表引擎上不起作用……不要知道为什么。 @over,如果您的引擎批量发送with,则批处理中的上一个命令必须以分号终止。试试;with .. 几天前我已经测试过“;with....”和“with”,因为另一个主题的另一个用户给了我一个“with”建议,我认为分号是一个错字。由于该查询不起作用,我开始尝试非常简单的基本“with”语句(有和没有分号作为开始字符),结果只是来自 Cognos Advanced Reporting 的神秘错误。

以上是关于同一张表上的多个连接:转换状态的主要内容,如果未能解决你的问题,请参考以下文章

Mysql在同一张表上的多个左连接

同一张表上的多个关系

同一张表上的多个事务,同时

SQL:同一表上的多个连接的性能

用where子句在同一张表上计算多个条件

在同一个表上具有多个连接的 Oracle 复杂查询