SQL-从2个表“duplicant”获取信息时匹配数据出现问题
我想在其中进行查询,以便监视以下内容: 从我们部门的某个人向某个人发送任务到我们部门收到反馈消息之间的时间 每个任务都可以分为消息,大多数任务都有2个发送和接收,其他任务更像是4+2x发送和2x接收。 我将发送和接收的消息放在一个不同的临时表中,名为;TaskTo,TaskBack。所有消息都有时间戳。他们也有一个描述,在这种情况下这并不重要 当我在一个任务中有4条或更多消息时,问题开始:SQL-从2个表“duplicant”获取信息时匹配数据出现问题,sql,Sql,我想在其中进行查询,以便监视以下内容: 从我们部门的某个人向某个人发送任务到我们部门收到反馈消息之间的时间 每个任务都可以分为消息,大多数任务都有2个发送和接收,其他任务更像是4+2x发送和2x接收。 我将发送和接收的消息放在一个不同的临时表中,名为;TaskTo,TaskBack。所有消息都有时间戳。他们也有一个描述,在这种情况下这并不重要 当我在一个任务中有4条或更多消息时,问题开始: Tables: Table = #TaskTo ╔════════╦════════╦══════╗ ║
Tables:
Table = #TaskTo
╔════════╦════════╦══════╗
║ ID ║ Time ║ Desc ║
╠════════╬════════╬══════╣
║ 1 ║ 14:25 ║ x ║
║ 2 ║ 16:00 ║ x ║
║ 2 ║ 11:00 ║ x ║
║ 3 ║ 15:02 ║ x ║
╚════════╩════════╩══════╝
Table = #TaskBack
╔════════╦════════╦══════╗
║ ID ║ Time ║ Desc ║
╠════════╬════════╬══════╣
║ 1 ║ 14:30 ║ x ║
║ 2 ║ 19:00 ║ x ║
║ 2 ║ 12:01 ║ x ║
║ 3 ║ 17:20 ║ x ║
╚════════╩════════╩══════╝
=================================
我有以下SQL查询:
SELECT DISTINCT
to.ID,
to.time as time1,
Bk.time as time2,
DATEDIFF (HOUR, to.EndTask,Bk.EndTask) as diff
FROM #TaskTo as to LEFT JOIN #TaskBack as Bk on to.TicketNumber = Bk.Ticketnumber
ORDER BY to.ID
=================================
这就是我得到的结果:
╔════════╦════════╦══════╦══════╗
║ ID ║ Time1 ║ time2║ diff ║
╠════════╬════════╬══════╬══════╣
║ 1 ║ 14:25 ║ 14:30║0 ║
║ 2 ║ 16:00 ║ 19:00║3 ║
║ 2 ║ 16:00 ║ 12:01║20 ║
║ 2 ║ 11:00 ║ 19:00║8 ║
║ 2 ║ 11:00 ║ 12:01║1 ║
║ 3 ║ 15:02 ║ 17:20║2 ║
╚════════╩════════╩══════╩══════╝
此处的问题是,数据是双面的:
梦想的情景是:
║ 2 ║ 16:00 ║ 19:00║3 ║
║ 2 ║ 11:00 ║ 12:01║1 ║
谁能解释一下我做错了什么
谢谢你抽出时间
致以亲切的问候,
M.我可以马上看到的问题: 你给我们看的表格没有唯一性,所以当然 你会得到重复的结果。 您的查询与表图表不匹配您没有提到 勾选图表中的任意位置。 您使用的是表别名和字段名。 我已经创建了一个,也许您可以扩展它,使它更符合您的情况,在您的问题中包括修改后的sql FIDLE 这是一个修订版 下面是代码示例:
SELECT tto.ID,
tto.[time] as time1,
tbk.[time] as time2,
DATEDIFF (HOUR, tto.[time],tbk.[time]) as diff
FROM (SELECT ID,
[Time],
Descr, ROW_NUMBER() OVER (ORDER BY
ID,
[Time]) AS rowId
FROM TaskTo) tto
LEFT JOIN (SELECT ID,
[Time],
Descr, ROW_NUMBER() OVER (ORDER BY
ID,
[Time]) AS rowId
FROM TaskBack
) AS tbk
ON tto.rowid = tbk.rowid
结果:
ID TIME1 TIME2 DIFF
1 14:25:00.0000000 14:30:00.0000000 0
2 11:00:00.0000000 12:01:00.0000000 1
2 16:00:00.0000000 19:00:00.0000000 3
3 15:02:00.0000000 17:20:00.0000000 2
注意,这些结果基于一个非常小的数据样本。我在这里对保留关键字使用T-SQL语法。如果您不使用SQL Server,请修改为其他人
SELECT
[to].ID,
[to].[time] as time1,
[Bk].[time] as time2,
DATEDIFF (HOUR, [to].EndTask,[Bk].EndTask) as diff
FROM
(
SELECT Id, [Time], [Desc],
LEAD([Time]) OVER (PARTITION BY Id ORDER BY [Time]) AS NextTime
FROM #TaskTo
) AS [To]
LEFT JOIN
(
SELECT Id, [Time], [Desc],
FROM #TaskBack
) AS Bk on [to].Id = Bk.Id AND [to].[Time] < [bk].[Time] AND ([to].NextTime > [bk].Time OR [to].NextTime IS NULL)
ORDER BY [to].ID
为什么事务ID中有重复项?这是您在输出中获得重复项的唯一原因。每个票证都应该有唯一的ID,您的解决方案将完美运行是ID还是票证号?您使用的是哪种DBMS?可以问一个没有taskBack吗?@Qxg,是的,在我与主管交谈后,我们只显示已解决的任务,因此,每个任务都应该有一条消息发送到和一条消息返回。我得到了以下错误:LEAD不是一个可识别的内置函数名,我在google上做了一些工作,发现了滞后和LEAD功能。我将尝试一些新的东西,希望它能起作用,我会随时通知你们。谢谢lot@MikamuraLEAD仅在SQL 2012中引入,因此,如果您使用的是旧版本,它将不适用于您。请参阅我上面的修改答案,了解一种避免潜在客户的可能解决方案。
SELECT
[to].ID,
[to].[time] as time1,
[Bk].[time] as time2,
DATEDIFF (HOUR, [to].EndTask,[Bk].EndTask) as diff
FROM
(
SELECT Id, [Time], [Desc],
LEAD([Time]) OVER (PARTITION BY Id ORDER BY [Time]) AS NextTime
FROM #TaskTo
) AS [To]
LEFT JOIN
(
SELECT Id, [Time], [Desc],
FROM #TaskBack
) AS Bk on [to].Id = Bk.Id AND [to].[Time] < [bk].[Time] AND ([to].NextTime > [bk].Time OR [to].NextTime IS NULL)
ORDER BY [to].ID