当前位置: 首页 > 面试题库 >

SQL Server在不同行之间查找datediff,求和

尹光辉
2023-03-14
问题内容

我正在尝试建立一个查询,以分析我们的时间跟踪系统中的数据。每次用户向内或向外滑动时,都会记录记录滑动时间以及“打开”或“关闭”站点(进入或退出)。在用户“
Joe Bloggs”的情况下,有4行,我想进行配对并计算出Joe Bloggs在网站上花费的总时间。

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

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 SQL2005。查询的报告时间是每月。

有人可以提出解决方案吗?我的数据已经按用户名和时间分组在一个表中,并且ID字段为Identity。


问题答案:
-- =====================
-- 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


 类似资料:
  • 问题内容: 我目前有一个与此类似的表格- 然后,我想计算每个记录的RecordTimes之间的时间差。为此,我正在使用以下内容- 哪个返回- 不过,我实际上要做的是在原始表中创建一个计算列,该列为我提供了这些值。这可能吗? 我以为我可以将查询转换为UDF,然后在列中进行引用,但是我对这种工作不是很有经验。 - -编辑 - - 最终结果应为- 问题答案: 我建议您为此使用视图: 由于您使用的是 SQ

  • 问题内容: 我有2个不同大小的数据帧df1和df2。 我的目标是确定df1中 没有 出现的元素。 通过使用以下代码行,我能够实现自己的目标。 有没有更优雅,更有效的方法来实现我的目标? 注意:解决方法是 问题答案: 我相信需要有: 默认情况下也忽略s行链接新条件: 如果没有必要,请省略,如果列中不存在: 如果两个列中都存在,则使用第二个解决方案: (输入s来自问题)

  • 问题内容: 我有一个格式如下的文件(频率,文件名,代码行): 我希望输出为: 基本上,文件包含来自文件的文件名和代码行,第一个字段是频率,即文件中的代码行数。 我应该明智地阅读这些代码行。我发现这很乏味,并且如果不同文件的条目之间存在行距,那么对我来说将更容易,因此需要输出。 问题答案: Awk可以做到: 是文件名。

  • 我试图使用clang和gcc交叉编译一个项目,但在使用时,我发现了一些奇怪的差异,例如。 现在,当涉及NAN时,我期望类型行为,但clang和gcc给出不同的结果: 当我使用它时,_mm_max_ps做了预期的事情。我尝试过使用,,但似乎没有效果。有什么想法可以让编译器之间的行为相似吗? 这里是锁销连接

  • 我有一个包含一系列事件及其时间戳的数据库。 我在这里读到这是可以在SQLite中实现的,我想知道是否也可以在presto中实现。我查看了文档,但找不到一个类似的函数来执行SQLite中的操作。

  • 问题内容: 给定两个相等长度的字符串,是否有一种优雅的方法来获取第一个不同字符的偏移量? 显而易见的解决方案是: 但这对于如此简单的任务而言似乎并不正确。 问题答案: 您可以使用按位XOR()的一个不错的属性来实现此目的:基本上,当您将两个字符串异或时,相同的字符将变为空字节()。因此,如果我们对两个字符串进行异或运算,我们只需要使用以下命令找到第一个非空字节的位置: 这里的所有都是它的。因此,让