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

GROUP BY用于SQL中的连续行

阎知
2023-03-14
问题内容

给出下表:

**身份证状态日期**
12 1 2009-07-16 10:00
45    **2**       2009-07-16 13:00
67    **2**       2009-07-16 14:40
77 1 2009-07-16 15:00
89 1 2009-07-16 15:30
99 1 2009-07-16 16:00

问题:
在保持状态变化之间的边界的同时,如何在“状态”字段中进行分组?

SELECT MIN(ID) AS ID, State, MIN(Date) AS Date, COUNT(ID) AS Count
FROM table GROUP BY State

结果如下:

**ID状态日期计数**
12 1 2009-07-16 10:00 4
45 2 2009-07-16 13:00 2

但这是预期的:

**ID状态日期计数**
12 1 2009-07-16 10:00 1
45 2 2009-07-16 13:00 2
77 1 2009-07-16 15:00 3

在SQL中这可能吗?到目前为止,我还没有找到解决方案…


问题答案:
SELECT  MIN(id) AS id, MIN(ts) AS ts, MIN(state) AS state, COUNT(*) cnt
FROM    (
        SELECT  @r := @r + (@state != state) AS gn,
                @state := state AS sn,
                s.*
        FROM    (
                SELECT  @r := 0,
                        @state := 0
                ) vars,
                t_state s
        ORDER BY
                ts
        ) q
GROUP BY
        gn

用于测试的表创建脚本:

CREATE TABLE t_state (id INT NOT NULL PRIMARY KEY, state INT NOT NULL, ts DATETIME NOT NULL);

INSERT
INTO  t_state
VALUES
(12,   1,      '2009-07-16 10:00'),
(45,   2,      '2009-07-16 13:00'),
(67,   2,      '2009-07-16 14:40'),
(77,   1,      '2009-07-16 15:00'),
(89,   1,      '2009-07-16 15:30'),
(99,   1,      '2009-07-16 16:00');


 类似资料:
  • 我被困在一个问题上,希望得到一些指导。我们希望生成一个报告,计算产品的连续日期(从用户提供的日期向后看)。数据集如下: 因此,我们想得出一份报告,该报告在2021年3月2日提供的日期如下所示: 尽管我正在努力编写查询,但我甚至不知道该怎么称呼它,因为我需要一个特定阈值上的连续值计数。我可以计算阈值以上的值,但不确定如何添加“连续数周”逻辑。

  • 我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。

  • 问题内容: 表名称调用 上面是一个示例,我需要找出的是如何找到连续无应答计数大于6的数字? 目前,我已经能够获得以下信息,但它不是连续的。 问题答案: 您可以使用变量来执行此操作。 该查询使用4个变量 1)@cur_outcome,它最初设置为空字符串。此后,选择将分配当前行的system_outcome。 2)@prev_outcome,最初设置为空字符串。此后,选择将其设置为@cur_outc

  • 问题内容: 我在Microsoft SQL Server 2008 R2上有一个名为DATA的表,具有三个不可为空的整数字段:ID,Sequence和Value。具有相同ID的序列值将是连续的,但可以以任何值开头。我需要一个查询,该查询将返回具有相同ID和值的连续行的计数。 例如,假设我有以下数据: 我想要以下结果: 我试过了 但这给了 它将所有具有相同值的行组合在一起,而不仅仅是连续的行。 有任

  • 问题内容: 我希望为每个人计算连续的一天咒语。 我的表: 这是我目前拥有的代码: 产生结果: 在我正在寻找这样的结果集的地方: 我需要计算连续1天以上的连续天数。然后将其作为某人拥有多少个连续咒语的总和。例如,弗雷德在这段时间内连续2次生病。如果某人有星期五和星期一休息,我也需要此内容,这应该算作一个连续的咒语。 我对如何到达那里有些迷失。任何帮助将不胜感激。 请参阅:http ://sqlfid

  • 我需要把数字按顺序排列(1,2,3,4...)在表列中。这些是发票号码,它们需要连续,没有空白,没有重复。是强制性要求,实际上是财政要求,所以我不能跳过。 我当前的aproach是使用第二个“numbers”表,表中有两列(Id,LastNumber),表中有一条记录,Id=1。这就是我现在正在做的事情:1。从Id=1 2的Numbers(xlock,rowlock)中选择(LastNumber+