我试图找出明星日期和结束日期的员工时钟。以下是我所掌握的数据示例。
PersonID EventTime ActivityCode
1 2019-07-29 00:03:03.000 7
1 2019-07-29 00:09:41.000 0
1 2019-07-29 00:01:07.000 7
1 2019-07-29 00:01:19.000 0
需要输出:
PersonID EventTime EndTime ActivityCode
1 2019-07-29 00:03:03.000 2019-07-29 00:09:41.000 7
1 2019-07-29 00:09:41.000 2019-07-29 00:01:07.000 0
1 2019-07-29 00:01:07.000 2019-07-29 00:01:19.000 7
1 2019-07-29 00:01:19.000 0
我必须根据eventtime和activitycode找到此人的开始日期和结束日期。开始日期将是事件时间列,我必须从行中下一个事件时间的同一列计算结束日期。
我曾尝试在T-SQL中使用lead函数,但它并没有给出我想要的结果。
select personid, activitycode, eventtime as starttime
, (lead(eventtime) over (order by personid)) as endtime
from ActivityTable
如果有人知道如何处理这个问题,我会非常感激。
像这样试试。。
CREATE TABLE #T
(
PersonID INT
,EventTime DATETIME
,ActivityCode INT
)
INSERT INTO #T(
PersonID
,EventTime
,ActivityCode
)
SELECT
PersonID
,EventTime
,ActivityCode
FROM
(VALUES ( 1,'2019-07-29 00:03:03.000', 7)
,(1,'2019-07-29 00:09:41.000', 0)
,(1,'2019-07-29 00:13:07.000', 7)
,(1,'2019-07-29 00:13:19.000', 0)) AS T (PersonID,EventTime,ActivityCode)
SELECT PersonID,EventTime,ActivityCode,
(SELECT MIN(EventTime) FROM #T T2 WHERE T1.PersonID = T2.PersonID AND
T1.EventTime < T2.EventTime)
FROM #T T1
在您的示例中,您的输出看起来有点奇怪,因为事件时间似乎发生在结束时间之后。如果您正在查找时间顺序,并且希望得到如下结果集:
那么xQbert的评论是正确的。您只需通过在订单中添加EventTime即可。请参见下面的示例代码。
CREATE TABLE #T (
PersonID INT
,EventTime DATETIME
,ActivityCode INT
)
INSERT INTO #T(
PersonID
,EventTime
,ActivityCode
)
SELECT
PersonID
,EventTime
,ActivityCode
FROM
(VALUES ( 1,'2019-07-29 00:03:03.000', 7)
,(1,'2019-07-29 00:09:41.000', 0)
,(1,'2019-07-29 00:01:07.000', 7)
,(1,'2019-07-29 00:01:19.000', 0)) AS T (PersonID,EventTime,ActivityCode)
SELECT
PersonID
,ActivityCode
,EventTime AS starttime
,(LEAD(EventTime) OVER (ORDER BY PersonID, EventTime DESC)) AS endtime
FROM
#T;
我想你的活动时间应该是13点而不是01点
示例
Declare @YourTable Table ([PersonID] varchar(50),[EventTime] datetime,[ActivityCode] int) Insert Into @YourTable Values
(1,'2019-07-29 00:03:03.000',7)
,(1,'2019-07-29 00:09:41.000',0)
,(1,'2019-07-29 00:13:07.000',7) << changed to 13
,(1,'2019-07-29 00:13:19.000',0) << changed to 13
Select PersonID
,EventTime
,EndTime= lead([EventTime],1) over (partition by [PersonID] order by [EventTime])
,ActivityCode
From @YourTable
Order by EventTime
退换商品
PersonID EventTime EndTime ActivityCode
1 2019-07-29 00:03:03.000 2019-07-29 00:09:41.000 7
1 2019-07-29 00:09:41.000 2019-07-29 00:13:07.000 0
1 2019-07-29 00:13:07.000 2019-07-29 00:13:19.000 7
1 2019-07-29 00:13:19.000 NULL 0
问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:
问题内容: 我在从表中显示正确的数据时遇到了麻烦。我不太确定要搜索什么。我不确定min(column)或max(column)在这里对我有帮助。让我们看看我是否可以解释我的问题。 我的表包含以下数据: 我将以一种观点来介绍这一点。它将按代码分组。 我想要的是此输出: 如您所见,DateTo和DateFrom之间是否存在间隙,我希望将其显示为两行。但是,如果具有相同代码的下一个“ DateFrom”
问题内容: 好吧,假设我有一个看起来像这样的表: 任何人都有关于如何查询它的想法,因此数据看起来像 问题答案: 我不会将ID放在这里,因为我认为它与查询无关。如果您愿意,请稍后再说。这是一个MSSQL查询。 可以很容易地将其翻译为其他数据库类型。
问题内容: 我在表中有此数据 每当FIELD_D中的值更改时,它就会组成一个组,而我需要该组中的最小和最大日期。查询应该返回 到目前为止,我看到的示例在Field_D中的数据是唯一的。这里的数据可以重复显示,首先是“ N”,然后变为“ P”,然后又回到“ N”。 任何帮助将不胜感激 谢谢 问题答案: 如果SQL实现支持分析功能,则可以使用LAG,LEAD和COUNT()OVER这样的解析函数,以发
问题内容: 我一直在尝试从时间戳字段中的第一个日期到最后一个日期生成一系列日期(YYYY-MM-DD HH)。我已经有了所需的内容,但是在尝试从表中获取开始日期和结束日期时遇到了一个问题。我有以下一个大概的想法: Postgres 9.3 问题答案: 您不需要CTE,这将比必要的成本更高。 而且您不需要强制转换为,当您向类型提供数据时,结果已经 是 数据类型。详细信息在这里: 在PostgreSQ
问题内容: 如果可能的话,在以下情况下,我希望使用joda或非joda解决方案 假设我的一周从2012年5月2日开始,给定的当前日期为02/22/2011。我需要计算给定当前日期的星期开始和结束日期。因此,我的解决方案的星期应该从02/19开始,而星期在02/25结束。为简单起见,我将我的工作日设置为02/05/2011,但是可能是任何一天,我的工作日始终为7天。 我现有的代码如下,但似乎无法按预