Tsql SQL选择以小时分隔的记录

Tsql SQL选择以小时分隔的记录,tsql,rank,Tsql,Rank,我正在尝试编写一个查询,该查询返回具有唯一person id、place id的值,并且只返回60分钟内第一次访问的值 这是我所需要的 SELECT * FROM ( SELECT RANK() OVER (PARTITION BY A.PersonId, A.PlaceId, DATEDIFF(hh, A.Visit_Datetime, GETDATE()) ORDER BY A.Visit_Datetime) AS RNK, A.RecordId, A.P

我正在尝试编写一个查询,该查询返回具有唯一person id、place id的值,并且只返回60分钟内第一次访问的值

这是我所需要的

SELECT * FROM
(
SELECT  
    RANK() OVER (PARTITION BY A.PersonId, A.PlaceId,
    DATEDIFF(hh, A.Visit_Datetime, GETDATE()) ORDER BY A.Visit_Datetime) AS RNK,
    A.RecordId,
    A.PersonId,
    A.PlaceId
FROM
    Table A
) A
WHERE
    A.Rnk = 1
问题是,如果一个人在上午10:50访问,然后在上午11:10创建第二条记录,则这两条记录都被列为1。我需要的是按个人、地点和60分钟范围对这些记录进行排名

我希望这是有道理的。谢谢你的帮助。

试试这个

SELECT * FROM 
( 
SELECT   
    RANK() OVER (PARTITION BY A.PersonId, A.PlaceId, 
    DATEDIFF(hh, 0, A.Visit_Datetime) ORDER BY A.Visit_Datetime) AS RNK, 
    A.RecordId, 
    A.PersonId, 
    A.PlaceId 
FROM 
    Table A 
) A 
WHERE 
    A.Rnk = 1 

当前,您正在分组由当前时间确定的固定时间段。 你想要一个移动的小时周期。这不能基于当前日期或类似于0的文字。 这意味着您需要对所有可能的时间段进行分组。幸运的是,您不需要全部计算它们。 而是将每次就诊的时间段分组。i、 e 10:50分为10:50至11:50之间的所有访问,11:10分为11:10至12:10之间的访问

FROM Table as A 
JOIN Table as B ON A.Visit_Datetime BETWEEN DATEADD(HOUR,-1,B.Visit_Datetime) 
    AND B.Visit_Datetime 
这将产生重叠的组,类似于多个秩为1。 B已连接到所有引用,但您需要第一个引用。 将引用分组,并使用“最小”获取第一个引用。 大概是这样的:

SELECT DISTINCT MIN(A.Visit_Datetime) as InitVisit, B.RecordId, B.PersonId, B.PlaceID, 
FROM Table as A 
JOIN Table as B ON A.Visit_Datetime BETWEEN DATEADD(HOUR,-1,B.Visit_Datetime) AND B.Visit_Datetime 
AND B.RecordId = A.RecordId AND B.PersonId = A.PersonId AND B.PlaceID = A.PlaceId 
GROUP BY B.RecordId, B.PersonId, B.PlaceID, B.Visit_Datetime 
这将为您提供每个记录、人员和地点的访问时间。访问时间实际上是任意长度的,但每次访问都在另一次访问的60分钟内。这听起来像是你想做的