SQL Server 查找不同行之间的 datediff、总和

2023-12-11

我正在尝试构建一个查询来分析我们的时间跟踪系统中的数据。每次用户滑入或滑出时,它都会生成一行记录滑入时间以及“在场”或“场外”(进入或退出)。在用户“Joe Bloggs”的情况下,有 4 行,我想将其配对并计算 Joe Bloggs 在网站上花费的总时间。

问题是有些记录不太容易配对。在给出的示例中,第二个用户有两个连续的“开”,我需要找到一种方法来忽略重复的“开”或“关”行。

ID  | Time                    |OnOffSite| UserName   
------------------------------------------------------
123 | 2011-10-25 09:00:00.000 | on      | Bloggs Joe |
124 | 2011-10-25 12:00:00.000 | off     | Bloggs Joe |
125 | 2011-10-25 13:00:00.000 | on      | Bloggs Joe |
126 | 2011-10-25 17:00:00.000 | off     | Bloggs Joe |
127 | 2011-10-25 09:00:00.000 | on      | Jonesy Ian |
128 | 2011-10-25 10:00:00.000 | on      | Jonesy Ian |
129 | 2011-10-25 11:00:00.000 | off     | Jonesy Ian |
130 | 2011-10-25 12:00:00.000 | on      | Jonesy Ian |
131 | 2011-10-25 15:00:00.000 | off     | Jonesy Ian |

我的系统是MS SQL 2005。查询的报告周期是每月。

有人能提出解决方案吗?我的数据已按用户名和时间分组在表中,ID 字段为“身份”。


-- =====================
-- sample data
-- =====================
declare @t table
(
    ID int,
    Time datetime,
    OnOffSite varchar(3),
    UserName varchar(50)
)

insert into @t values(123, '2011-10-25 09:00:00.000', 'on', 'Bloggs Joe')
insert into @t values(124, '2011-10-25 12:00:00.000', 'off', 'Bloggs Joe')
insert into @t values(125, '2011-10-25 13:00:00.000', 'on', 'Bloggs Joe')
insert into @t values(126, '2011-10-25 17:00:00.000', 'off', 'Bloggs Joe')
insert into @t values(127, '2011-10-25 09:00:00.000', 'on', 'Jonesy Ian')
insert into @t values(128, '2011-10-25 10:00:00.000', 'on', 'Jonesy Ian')
insert into @t values(129, '2011-10-25 11:00:00.000', 'off', 'Jonesy Ian')
insert into @t values(130, '2011-10-25 12:00:00.000', 'on', 'Jonesy Ian')
insert into @t values(131, '2011-10-25 15:00:00.000', 'off', 'Jonesy Ian')

-- =====================
-- solution
-- =====================
select
    UserName, timeon, timeoff, diffinhours = DATEDIFF(hh, timeon, timeoff)
from
(
    select
        UserName,
        timeon = max(case when k = 2 and OnOffSite = 'on' then Time end),
        timeoff = max(case when k = 1 and OnOffSite = 'off' then Time end)
    from
    (
        select
            ID,
            UserName,
            OnOffSite,
            Time,
            rn = ROW_NUMBER() over(partition by username order by id)
        from
        (
            select
                ID,
                UserName,
                OnOffSite,
                Time,
                rn2 = case OnOffSite 
                -- '(..order by id)' takes earliest 'on' in the sequence of 'on's
                -- to take the latest use '(...order by id desc)'
                when 'on' then 
                    ROW_NUMBER() over(partition by UserName, OnOffSite, rn1 order by id)
                -- '(... order by id desc)' takes the latest 'off' in the sequence of 'off's
                -- to take the earliest use '(...order by id)'
                when 'off' then
                    ROW_NUMBER() over(partition by UserName, OnOffSite, rn1 order by id desc)
                end,
                rn1
            from
            (
                select
                    *,
                    rn1 = ROW_NUMBER() over(partition by username order by id) +
                        ROW_NUMBER() over(partition by username, onoffsite order by id desc)
                from @t
            ) t
        ) t
        where rn2 = 1
    ) t1
    cross join
    (
        select k = 1 union select k = 2
    ) t2
    group by UserName, rn + k
) t
where timeon is not null or timeoff is not null
order by username
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 查找不同行之间的 datediff、总和 的相关文章

  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • Entity Framework 6(代码优先)实体版本控制和审计

    我正在考虑将 Entity Framework 6 1 1 与 SQL Server 2008 R2 一起使用 目前 我正在使用代码优先的 EF 功能创建模型和数据库 我的基本用例是创建一个特定实体的所有更改的日志 ID是关键栏 以帮助审核
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 可以有一个带有可变列的表吗?

    这可能是一个愚蠢的问题 但这里是 是否可以创建一个能够包含具有可变列数和自定义列名称的行的动态表 我浏览过 EAV 建模 但看起来很沉重 现实生活中的例子可能是这样的 假设我有一个客户登记册 但每个客户可能需要输入不同的信息 根据您要输入的
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • Microsoft SQL:CASE WHEN 与 ISNULL/NULLIF

    除了可读性之外 在防止 SQL 中的除以 0 错误时 使用 CASE WHEN 语句与 ISNULL NULLIF 相比还有什么显着的好处吗 CASE WHEN BeginningQuantity BAdjustedQuantity 0 T
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • SQL Server 中离线索引重建和在线索引重建有什么区别?

    重建索引时 有一个选项ONLINE OFF and ONLINE ON 我知道当ONLINE模式打开时 它会复制索引 切换新查询以利用它 然后重建原始索引 使用版本控制跟踪两者的更改 如果我错了 请纠正我 但是 SQL 在离线模式下会做什么
  • SQL服务器超时

    我的应用程序是在经典 asp 上开发的 但也使用 asp net 因为我正在将应用程序迁移到 Net 上 它使用 SQL Server 作为数据库并托管在 Windows Server 2003 上 现在的问题是应用程序在很长一段时间内继续

随机推荐

  • iOS 15 中 UIButton 图像行为发生变化?

    我的代码很简单 我有一个 UIButton 的出口 button 我在代码中设置它的图像 let jack UIImage named jack png self button setImage jack for normal 问题是这并不
  • Cython C++ 包装器运算符() 重载错误

    与我之前的问题有关 使用 Cython 包装使用 OpenCV 类型作为参数的 C 类 现在我陷入了另一个错误 我的 OpenCV 类型 Matx33d 的 cython 包装代码如下所示 cdef extern from opencv2
  • Eclipse:运行时我们如何获取 main 参数

    在 Java 中 对于普通的 main 方法 public static void main String args code here String args用于从命令行获取一些参数 我可以通过以下方式从命令提示符运行此文件 javac
  • 为什么修改迭代变量不影响后续迭代?

    这是我遇到问题的 Python 代码 for i in range 0 10 if i 5 i 3 print i 我预计输出是 0 1 2 3 4 8 9 然而 翻译却吐槽道 0 1 2 3 4 8 6 7 8 9 我知道一个for循环在
  • 在 matlab 等高线图中选择特定水平

    我有这个plot我生成它是为了测试等值线图在 matlab 上的工作原理 我想弄清楚是否有一种方法可以只绘制其中一条线 但不一定是第一条线 Matlab 的解释是 如果你这样做 contour X Y Z 1 它会绘制其中一条线 但它始终是
  • Oracle SQL 对版本号进行排序

    在 Oracle 中 只需使用ORDER BY不对版本号进行排序 我的Version Number字段被声明为VARCHAR我无法改变它 例如 以下版本 1 20 1 9 1 18 1 13 1 5 1 11 2 0 1 8 1 3 1 2
  • 使用SFTP / RCurl创建远程目录

    是否可以使用 RCurl 包在 SFTP 站点上创建目录 我找到了sftp create dirs函数 但我找不到如何使用它的示例 我尝试设置ftp create missing dirs选项TRUE as in library RCurl
  • JavaScript 提升函数与函数变量

    这是我的 JavaScript 代码 console log a c b var a Hello World var b function console log B is called function c console log C i
  • AttributeError:构建逻辑回归模型时“str”对象没有属性“decode”[重复]

    这个问题在这里已经有答案了 我正在尝试建立一个逻辑回归模型 但它显示了AttributeError str object has no attribute decode 请帮我解决这个问题 该代码在 Datacamp 的服务器上完美运行 但
  • ValueError:解析日期时时间数据与格式不匹配

    当我尝试将字符串解析为日期时间时 我这样做 之前已导入日期时间 fecha 2 datetime strptime 22 01 2019 17 00 d m y H M 但是 我收到此错误 ValueError 时间数据 22 01 201
  • PHP 方法链接的好处?

    仍在 PHP OOP 训练轮上 这个问题可能属于失败博客网站 PHP 中的方法链有什么好处 我不确定这是否重要 但我将静态调用我的方法 例如 foo Bar get sysop gt set admin gt render 根据我的阅读 任
  • 从 GradientBoostingClassifier 中提取决策规则

    我已经解决了以下问题 如何提取梯度提升分类器的决策规则 如何从 scikit learn 决策树中提取决策规则 然而以上两个并没有解决我的目的 以下是我的查询 我需要使用gradientboostingclassifer在Python中构建
  • 为什么在输入n之前声明数组的大小为n,第一次有效,但第二次就不行了?

    我正在解决一个问题 在输入 n 的值之前 我将数组的大小声明为 n 它适用于第一个测试用例 但不适用于第二个测试用例 为什么 P S 我在网上找不到任何相关信息 这是代码片段 int n arr n cin gt gt n int n ar
  • 快速从 findObjectsInBackgroundWithBlock 获取数据

    我正在使用 Parse 从数据库中获取数据 当块 findObjectsInBackgroundWithBlock 被调用时 会传递一个数组 由于我只接收一行数据 因此它全部出现在数组的一个 0 部分中 那么我如何从该数组中获取所有位 这是
  • 正确的表格标题

    语义问题 如果我有一个基本上是一张大表的 HTML 页面 我应该使用什么元素作为标题 通常 您会使用h1用于页面标题 以及caption作为表格的标题 但是 如果表格是页面上唯一的内容怎么办 包括两者看起来有点傻 那我用一个h1并忘记cap
  • 未找到配置或 get/set 在 Angular 6 中已被弃用

    ng config global defaults styleExt scss 错误 找不到配置 ng set global defaults styleExt scss 错误 get set 已被弃用 取而代之的是 config 命令 已
  • PyQT5错误:无法找到或加载Qt平台插件xcb

    直到 为止Anaconda3 其中包含Python 3 4 已重新安装在我的RedHat 6 5工作站 我已经能够开发使用的Python应用程序PyQT5 重新安装后Anaconda我收到一条错误消息 无法找到或加载 Qt 平台插件 xcb
  • React 虚拟化下拉菜单被溢出剪切:隐藏

    我正在为我的表使用react virtualized 我想在单击单元格中的按钮时显示一个下拉菜单 问题是我的下拉菜单被表格的行高抑制 行高 40 行高度 200 我玩过css定位 但到目前为止没有任何效果 下拉菜单代码 div div
  • 具有线程的多上下文 CoreData

    UPDATE 我想问题是保存子上下文时父上下文没有更新 仍然需要帮助 我尝试过很多多上下文 父子 核心数据的例子 以前我的应用程序使用传统的数据存储方式 即我使用了一个OperationQueue 我从服务器获取数据并使用MOC保存到数据库
  • SQL Server 查找不同行之间的 datediff、总和

    我正在尝试构建一个查询来分析我们的时间跟踪系统中的数据 每次用户滑入或滑出时 它都会生成一行记录滑入时间以及 在场 或 场外 进入或退出 在用户 Joe Bloggs 的情况下 有 4 行 我想将其配对并计算 Joe Bloggs 在网站上