【问题标题】:Problem in formatting result set in desired format以所需格式格式化结果集的问题
【发布时间】:2018-10-26 07:26:48
【问题描述】:

我的设备安装在具有不同区域 ID 的不同位置,我按以下格式按小时返回不同区域的设备活动状态。

AreaId  |   UpdatedOn             | DeviceStatus
  1     | 2018-08-08 00:00:00.000 | Active
  1     | 2018-08-08 01:00:00.000 | Active
  1     | 2018-08-08 02:00:00.000 | Active
  2     | 2018-08-08 00:00:00.000 | Inactive
  2     | 2018-08-08 01:00:00.000 | Active
  2     | 2018-08-08 02:00:00.000 | Active
  3     | 2018-08-08 00:00:00.000 | Active
  3     | 2018-08-08 01:00:00.000 | Inactive
  3     | 2018-08-08 02:00:00.000 | Inactive

设备 1 自始至终都处于活动状态,因此可以清楚地看到。设备 2 从 00.00 到 01.00 Hrs 未激活 并且设备 3 在 01.00 到 02.00 和 02.00 到 03.00 Hrs. 期间没有活动。

我想以以下格式显示此数据。

2018 年 8 月 8 日 0:00 至 03:00 的设备状态

Areaid     | Status
1          | Active
2          | Not Active between 00:00 hrs to 01:00 hrs
3          | Not Active between 01:00 hrs to 02:00 hrs and  02:00 hrs to 03:00 hrs

适用于所有区域。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql sql-server tsql formatting


    【解决方案1】:

    您可以尝试在子查询中使用STUFF函数获取DeviceStatus = 'Inactive'行数据,然后outer join基于AreaId

    SELECT t2.AreaId, coalesce(Status,'Active') Status
    FROM (
        SELECT distinct AreaId,DeviceStatus,
               STUFF((
                 SELECT ' and ' + CONVERT(VARCHAR(5),UpdatedOn,108) + ' hrs' + ' to ' + CONVERT(VARCHAR(5),DATEADD(HOUR,1,UpdatedOn),108) + ' hrs'
                 FROM T tt
                 WHERE tt.AreaId = t1.AreaId and tt.DeviceStatus =  t1.DeviceStatus
                 FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
               ,1,4,'') Status
    
        FROM T t1
        WHERE DeviceStatus = 'Inactive'
    ) t1 RIGHT JOIN 
    (
        SELECT distinct AreaId
        FROM T
    ) t2
    on t1.AreaId = t2.AreaId 
    

    sqlfiddle

    结果

    AreaId  Status
    1      Active
    2      00:00 hrs to 01:00 hrs
    3      01:00 hrs to 02:00 hrs and 02:00 hrs to 03:00 hrs
    

    【讨论】:

    • 并非如此。它显示了部分正确的结果。我已经从第 508 行集成了您的代码请查看 dbfiddle dbfiddle.uk/…
    • 如果设备在 1:00-2:00 和 2:00-3:00 小时内处于非活动状态,它应该显示 从 1:00 到3:00 小时,并且不是从 1:00 到 2:00 不活动,从 2:00 到 3:00 不活动
    • 如果您能帮我解决这个问题,我将不胜感激。
    • @ThugsofHindustan 但是你的预期结果是01:00 hrs to 02:00 hrs and 02:00 hrs to 03:00 hrs 所以它是`01:00 到 03:00`?
    • 您能否提供您对此dbfiddle.uk/…的预期结果@
    【解决方案2】:

    您可以在下面使用 lag() 函数尝试

    DEMO

    select id,concat('Not Active between ', format(cast(prevd as datetime),' hh:mm '), 'hrs to ', format(cast(d as datetime),' hh:mm '), 'hrs') from
    (select *,
    LAG (d, 1, 0) OVER (PARTITION BY id ORDER BY d) prevd,
    LAG (p, 1, 0) OVER (PARTITION BY id ORDER BY d) prevp
    from cte1 
    )a where prevp<>'0' and p<>prevp
    

    输出:

    id  status
    1   Not Active between  01:00 hrs to  02:00 hrs
    2   Not Active between  01:00 hrs to  02:00 hrs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      相关资源
      最近更新 更多