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

如果某些列值在SQL中紧接在后,则将行分组

江阳冰
2023-03-14
问题内容

我正在使用MS SQL Server 2008,并且我想这样做:

+------+--------+--------+------------+
| id   | Name   | Event  | Timestamp  |
+------+--------+--------+------------+
|    0 | bob    | note   | 14:20      |
|    1 | bob    | time   | 14:22      |
|    2 | bob    | time   | 14:40      |
|    3 | bob    | time   | 14:45      |
|    4 | bob    | send   | 14:48      |
|    5 | bob    | time   | 15:30      |
|    6 | bob    | note   | 15:35      |
|    7 | bob    | note   | 18:00      |
+------+--------+--------+------------+

要成为这个:

+------+--------+--------+------------+
| id   | Name   | Event  | Timestamp  |
+------+--------+--------+------------+
|    0 | bob    | note   | 14:20      |
|    1 | bob    | time   | 14:22      |
|    4 | bob    | send   | 14:48      |
|    5 | bob    | time   | 15:30      |
|    6 | bob    | note   | 15:35      |
+------+--------+--------+------------+

即,行由“事件”列“分组”。每个 分组的 相同“事件”中仅显示一个。

  • 如果一个事件(例如ID为0的“ note”)在表中没有紧靠其前后(具有最近时间戳记的行)的行,且具有相等的“ event”值,则显示该事件;
  • 如果同一事件有多个行,例如ID为1-3的“时间”。出现在彼此之后(即没有带有不同“事件”的行具有在它们之间的时间戳),它们中的任何一个都被显示(对我而言无关紧要,所有其他列都是相同的)。

这两个是唯一的规则。


问题答案:

如果ids是一个接一个的尝试,请按照以下方式进行操作:

select * into #tab from(
    select 0 as id, 'bob' as name, 'note' as event, '14:20' as time union
    select 1, 'bob', 'time', '14:22' union
    select 2, 'bob', 'time', '14:40' union
    select 3, 'bob', 'time', '14:45' union
    select 4, 'bob', 'send', '14:48' union
    select 5, 'bob', 'time', '15:30' union
    select 6, 'bob', 'note', '15:35' union
    select 7, 'bob', 'note', '18:00'
) t

select t.*
from #tab t
left join #tab t1 on t.id = t1.id + 1 and t1.event = t.event 
    -- and t1.name = t.name -- if there are more names you are going to need this one as well
where t1.id is null

结果:

id  name    event   time
0   bob     note    14:20
1   bob     time    14:22
4   bob     send    14:48
5   bob     time    15:30
6   bob     note    15:35

添加:

如果ids不是一个接一个的,则可以使它们成为:

select identity(int, 1, 1) as id, name, event, time 
into #tab_ordered_ids
from #tab order by name, id, time


 类似资料:
  • 如何根据列中的数字是否在定义的范围内,将行筛选到特定的csv文件中? 我试图让和之间的任何东西输出到,但是当我运行它时什么都不会发生:

  • 所以我的数据集有一些信息,按业务n日期如下: 我需要以下格式的数据:我如何转换它。我不想在我的输出数据集中使用多级 我尝试了以下语法: 我得到的结果如下: 当我打印列时,它不会将LOB显示为列。我的最终数据帧还应该包括业务,日期字段作为列,以便我可以加入这个数据帧与另一个业务数据帧

  • 我有例如[100,30]数据帧,我想找到哪些行有超过20列的值?所有行都有30列,但其中一些有NaN值,因此我设置了20列的限制,我想在col.iloc=20之后找到哪些行有列的值 例如,即使在行号05我们有更多的楠值,由于分布,我想找到哪些行有超过3列的X值或楠值(在下表中,我想找到行号1、3、4和7的索引。 我的预期结果: 我发现行的 ID:1,3,4,7 是行在列中有值 但在大型数据帧中 这

  • 假设我有下面的。我想组合价格列和值列,以便所有价格都在一列中,所有卷都在另一列中。我还想要标识价格级别的第三列。例如,、和。 这就是最终的df应该是什么样子: 我尝试使用,我认为几乎有正确的答案。 这就是熔融时部分df的样子: 上面的问题是,数量和价格在同一列中,但我希望它们在两个单独的列中。 我使用了正确的函数吗?

  • 我想创建一个名为Playercategory的新专栏, 如果玩家的国籍为“美国”或除欧洲国家外的任何其他国家的美国,则Playercategory==“美国” 如果玩家的国籍是欧洲国家或与任何其他国家的欧洲国家,则Playerclass=="欧洲"(例如:"意大利"、"意大利/美国"、"德国/美国"、"立陶宛/澳大利亚"、"比利时") 对于所有其他玩家,则Playercategory==“非” 预

  • 问题内容: 我有一个脚本,它使用DROP TABLE IF EXISTS删除表的负载,这可以工作。 此脚本中还有一个删除操作,用于从我不管理的另一个表中删除一行。该表可能存在或不存在。是否有任何在尝试删除行之前检查该表是否存在? 这需要适用于MYSQL和SQLServer 谢谢亚历克斯 问题答案: 要签入SQL SERVER, 要检查mysql: 您只需数: