来自最新数据和两个表

时间:2016-06-30 08:51:10

标签: sql visual-studio-2015

我是一名正在尝试我的迷你项目的学生。我的迷你项目是检查房间的状态。有了这个,我用表创建了。

第一个表是房间状态。在房间状态表中只有Id和状态。

会议室状态数据

Room_Status

第二个表格是房间当前状态。在其中,它有Id,Site_Id,Room_Status_Id,Time。

房间当前状态数据

Room Current Status

我需要一个sql语句来计算我查询状态的房间基础的最新状态,一个例子是我希望状态为" R'。没有重复的site_id。

从数据中我应该得到的结果" 4"当我查询" R"。

我已经尝试了一些sql语句,但无法让它工作。

SQL语句我试过并返回我想要的但我需要计算一下: "选择状态,max_date =最大(时间),Site_Id来自Toilet_Status内部联接Toilet_Cur_Status b on a.Id = b.Toilet_Status_Id group by Site_Id,状态有a.Status =' R'&# 34;

3 个答案:

答案 0 :(得分:1)

   select a.id,a.status,count(b.site_id) tot from 
    DataRoomStatus a join (
    select *, row_number() over (partition by site_id order by time desc) as rn 
    from DataofRoomCurrentStatus) b

     on a.id=b.room_status_id
where rn=1 group by a.id,a.status

答案 1 :(得分:1)

我没有完全理解你的要求,但这是我的尝试。

样本数据

CREATE TABLE #RoomStatus (Id int, Status varchar(1))
INSERT INTO #RoomStatus (Id, Status)
VALUES (900,'G'), (901, 'R')

CREATE TABLE #RoomCurrentStatus (Id int, Site_Id int, Room_Status_Id int, Time datetime)
INSERT INTO #RoomCurrentStatus (Id, Site_Id, Room_Status_Id, Time)
VALUES
 (1000,300,900,'2016-06-10 15:01:30.000')
,(1001,301,900,'2016-06-10 15:01:30.000')
,(1004,304,901,'2016-06-10 15:04:30.000')
,(1005,305,901,'2016-06-10 15:05:30.000')
,(1006,306,900,'2016-06-10 15:06:30.000')
,(1007,307,900,'2016-06-10 15:07:30.000')
,(1010,310,901,'2016-06-10 15:10:30.000')
,(1011,311,901,'2016-06-10 15:11:30.000')
,(1012,311,900,'2016-06-11 15:11:30.000')
,(1013,311,901,'2016-06-12 15:11:30.000') 

此查询将根据Site_Id字段为您提供Status中唯一值的数量。

SELECT
rcs.Site_Id 
,rs.[Status] StatusFlag
,MAX(rcs.[Time]) LatestTime
FROM #RoomCurrentStatus rcs
JOIN #RoomStatus rs
    ON rcs.Room_Status_Id = rs.Id
GROUP BY rcs.Site_Id, rs.[Status]

结果将是

Site_Id StatusFlag  LatestTime
300     G           2016-06-10 15:01:30.000
301     G           2016-06-10 15:01:30.000
306     G           2016-06-10 15:06:30.000
307     G           2016-06-10 15:07:30.000
311     G           2016-06-11 15:11:30.000
304     R           2016-06-10 15:04:30.000
305     R           2016-06-10 15:05:30.000
310     R           2016-06-10 15:10:30.000
311     R           2016-06-12 15:11:30.000

我知道你已经说过你应该有4个和4个但是我不知道这是怎么回事提供的数据。

编辑,这可能是你之后的

SELECT
a.Site_Id
,a.LatestTime
,c.[Status]
FROM
    (
        SELECT
        rcs.Site_Id 
        ,MAX(rcs.[Time]) LatestTime
        FROM #RoomCurrentStatus rcs
        GROUP BY rcs.Site_Id
    ) a
JOIN #RoomCurrentStatus b
    ON a.LatestTime = b.[Time]
    AND a.Site_Id = b.Site_Id
JOIN #RoomStatus c
    ON b.Room_Status_Id = c.Id

结果;

Site_Id LatestTime                  Status
311     2016-06-12 15:11:30.000     R
310     2016-06-10 15:10:30.000     R
307     2016-06-10 15:07:30.000     G
306     2016-06-10 15:06:30.000     G
305     2016-06-10 15:05:30.000     R
304     2016-06-10 15:04:30.000     R
301     2016-06-10 15:01:30.000     G
300     2016-06-10 15:01:30.000     G

如果您只想将结果作为数字,请使用以下查询;

DECLARE @SearchValue varchar(1); SET @SearchValue = 'R'

SELECT
COUNT(1) ResultCount
FROM
    (
        SELECT
        rcs.Site_Id 
        ,MAX(rcs.[Time]) LatestTime
        FROM #RoomCurrentStatus rcs
        GROUP BY rcs.Site_Id
    ) a
JOIN #RoomCurrentStatus b
    ON a.LatestTime = b.[Time]
    AND a.Site_Id = b.Site_Id
JOIN #RoomStatus c
    ON b.Room_Status_Id = c.Id
WHERE c.[Status] = @SearchValue

您可以将参数更改为R或G,它将给出结果

ResultCount
4

答案 2 :(得分:1)

我认为这会给你你想要的东西:

SELECT
    s.status, COUNT(r.site_id) count
FROM RoomCurrentStatus r
INNER JOIN 
    ( SELECT site_id, MAX(time) maxTime FROM RoomCurrentStatus GROUP BY site_id ) latestRoomCurrentStatus
    ON r.site_id = latestRoomCurrentStatus.site_id
    AND r.time = latestRoomCurrentStatus.maxTime
INNER JOIN RoomStatus s ON r.room_status_id = s.id

关键部分是加入Max查询以过滤RoomCurrentStatus记录以仅包含最新记录。这是一个非常常见的模式,所以很难理解!