同一张表上的多个连接:转换状态
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 的神秘错误。以上是关于同一张表上的多个连接:转换状态的主要内容,如果未能解决你的问题,请参考以下文章