将查询结果合并为一行并显示时间跨度?

时间:2015-05-28 14:20:19

标签: sql sql-server sql-server-2012

首先,我为没有小提琴而道歉,但我的数据集太大了。所以我是including a file

我有一组将用户数据与位置数据相结合的查询。从RF设备收集位置历史数据,并且持久保存该用户的历史。反对提供的SQL file我需要将工作人员可能进入房间的数据合并,离开那个房间,然后回来。该示例可以构成对患者的访问。另一个例子是工作人员连续登录房间。我们只关注时间戳长度超过2分钟的数据。这意味着如果工作人员走过房间并且记录了该位置,则RF读取器可以读取标签。以下是一组初始查询:

with 

StaffHistory as(
SELECT
LocationHistories.UserProfileId,
UserProfiles.FirstName,
UserProfiles.LastName,
LocationHistories.LocationId,
Locations.LocationName,
LocationHistories.LocationHistoryTimeStamp,
PreviousLocationTime = LAG(LocationHistories.LocationHistoryTimeStamp, 1) OVER 
  (PARTITION BY LocationHistories.UserProfileId ORDER BY LocationHistories.LocationHistoryTimeStamp),
NextLocationTime = Lead(LocationHistories.LocationHistoryTimeStamp, 1) OVER 
  (PARTITION BY LocationHistories.UserProfileId ORDER BY LocationHistories.LocationHistoryTimeStamp)
FROM
LocationHistories
INNER JOIN UserProfiles ON LocationHistories.UserProfileId = UserProfiles.Id
INNER JOIN Locations ON LocationHistories.LocationId = Locations.Id
where LocationTrackingType = 1),

StaffInRoomTime as(
SELECT
StaffHistory.UserProfileId,
StaffHistory.FirstName,
StaffHistory.LastName,
StaffHistory.LocationId,
StaffHistory.LocationName,
DATEDIFF(SECOND, LocationHistoryTimeStamp, NextLocationTime) as TimeSpentInRoom,
StaffHistory.LocationHistoryTimeStamp,
StaffHistory.PreviousLocationTime,
StaffHistory.NextLocationTime

FROM
StaffHistory
Where DATEDIFF(SECOND, LocationHistoryTimeStamp, NextLocationTime) > 120
)

select * from StaffInRoomTime ORDER BY UserProfileId, LocationHistoryTimeStamp

我在这个例子中使用了常用的表表达式。这些是DB中的实际视图。

第一个查询将历史记录与员工联系起来。我们还为Previous记录时间和Next记录时间创建了几列。这样我们就可以确定房间的时间长度。

第二个查询来自第一个查询,我们在此期间设置了一个列,指明工作人员在该位置的时长,我们还会过滤LocationHistoryTimeStampNextLocationTime所在的任何数据。超过2分钟。

我想要实现的是将工作人员连续登录房间或者如果他们离开房间然后回来的数据。

以下是工作人员连续进入房间的数据集示例: enter image description here

这将是结果: enter image description here

以下是针对特定访问跨越多个房间的示例: enter image description here

我尝试在使用Inner Join的第二个查询上使用Min(LocationHistoryTimeStamp)。然而,时间跨度最终不正确,所以我错过了一些东西。

这是我试过的内连接查询:

 Select
    StaffHistory.LocationId, 
    StaffHistory.LocationName, 
    StaffHistory.UserProfileId,
    Min(LocationHistoryTimeStamp) as LocationHistoryTimeStamp,

    DATEDIFF(SECOND, Min(LocationHistoryTimeStamp), Lead(Min(LocationHistoryTimeStamp), 1) OVER 
      (PARTITION BY UserProfileId ORDER BY Min(LocationHistoryTimeStamp))) As TimeSpentInRoom,

    NextLocationTime = Lead(Min(LocationHistoryTimeStamp), 1) OVER 
      (PARTITION BY UserProfileId ORDER BY Min(LocationHistoryTimeStamp))
    FROM
    StaffHistory 
    Where TimeSpentInRoom > 120
    GROUP BY LocationId,LocationName,UserProfileId

1 个答案:

答案 0 :(得分:1)

这是声明:

GET /my_index/blogpost/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": {
            "name": "bill"
            }
        }
      ]
    }
  }
}