在 SQL 中仅选择列中重复值的第一行

2024-04-11

我有一个表,其中有一列可能在突发中具有相同的值。像这样:

+----+---------+
| id |   Col1  | 
+----+---------+
| 1  | 6050000 |
+----+---------+
| 2  | 6050000 |
+----+---------+
| 3  | 6050000 |
+----+---------+
| 4  | 6060000 |
+----+---------+
| 5  | 6060000 |
+----+---------+
| 6  | 6060000 |
+----+---------+
| 7  | 6060000 |
+----+---------+
| 8  | 6060000 |
+----+---------+
| 9  | 6050000 |
+----+---------+
| 10 | 6000000 |
+----+---------+
| 11 | 6000000 |
+----+---------+

现在我想修剪值的行Col1重复并且仅选择第一次出现的情况。
对于上表,结果应该是:

+----+---------+
| id |   Col1  | 
+----+---------+
| 1  | 6050000 |
+----+---------+
| 4  | 6060000 |
+----+---------+
| 9  | 6050000 |
+----+---------+
| 10 | 6000000 |
+----+---------+

我怎样才能在 SQL 中做到这一点?
请注意,仅应删除突发行,并且可以在非突发行中重复值! id=1 & id=9在样本结果中重复。

EDIT:
我用这个实现了它:

select id,col1 from data as d1
where not exists (
    Select id from data as d2
    where d2.id=d1.id-1 and d1.col1=d2.col1 order by id limit 1)

但这仅在 id 连续时有效。由于 ID 之间存在间隙(已删除的 ID),查询会中断。我怎样才能解决这个问题?


您可以使用EXISTS半连接来识别候选人:

选择想要的行:

SELECT * FROM tbl t
WHERE  NOT EXISTS (
    SELECT *
    FROM   tbl
    WHERE  col1 = t.col1
    AND    id = t.id - 1
    )
ORDER  BY id;

删除不需要的行:

DELETE FROM tbl AS t
-- SELECT * FROM tbl t  -- check first?
WHERE EXISTS (
    SELECT *
    FROM   tbl
    WHERE  col1 = t.col1
    AND    id   = t.id - 1
    );

这有效地删除了每一行,其中前一行具有相同的值col1,从而达到您的设定目标:只有每次突发的第一行幸存下来。

我留下了评论SELECT声明,因为你应该always在执行此操作之前检查要删除的内容。

非连续ID的解决方案:

如果您的 RDBMS 支持CTEs https://en.wikipedia.org/wiki/Common_table_expression and 窗函数 https://en.wikipedia.org/wiki/Window_function_%28SQL%29#Window_function(例如 PostgreSQL、Oracle、SQL Server...但是not SQLite v3.25之前 https://sqlite.org/releaselog/3_25_0.html、MS Access 或 MySQLv8.0.1之前 https://dev.mysql.com/doc/refman/8.0/en/with.html),有一个优雅的方法:

WITH cte AS (
    SELECT *, row_number() OVER (ORDER BY id) AS rn
    FROM   tbl
    )
SELECT id, col1
FROM   cte c
WHERE  NOT EXISTS (
    SELECT *
    FROM   cte
    WHERE  col1 = c.col1
    AND    rn   = c.rn - 1
    )
ORDER  BY id;

另一种方式完成这项工作没有那些细节(应该适合你):

SELECT id, col1
FROM   tbl t
WHERE  (
    SELECT col1 = t.col1
    FROM   tbl
    WHERE  id < t.id
    ORDER  BY id DESC
    LIMIT  1) IS NOT TRUE
ORDER  BY id;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL 中仅选择列中重复值的第一行 的相关文章

  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 将 Android 应用程序从 Lite 升级到 Pro 版本时保持相同的 SQLite 数据库

    首先 我已经进行了搜索 但找不到我的问题的具体答案 所以这里是 我正在编写我的第一个 Android 应用程序 并计划拥有 Lite 版本 有限功能 和付费版本 完整功能 Lite 和 Pro 版本将使用相同的 SQLite 数据库结构 如
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 如何在 SQLite 中将时间戳转换为字符串?

    我有一个表 其中存储了时间戳 以毫秒为单位 我想将这些时间戳转换为人类可读的形式 这是我的表的输出示例 SELECT date raw strftime d m Y date 1000 as string FROM my table raw
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • Android - 在sqlite数据库中存储敏感数据

    我需要将敏感数据存储在 Android 应用程序的 sqlite 数据库中 我如何确定这些数据非常安全 我知道我可以使用密钥加密数据 但是我将该密钥存储在哪里 我也不想要求用户填写密钥 我只是希望它能够自行工作 因为我害怕逆向工程 所以我也
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • SQLite插入大量记录时出现问题

    我试图使用 SQLite3 shell 在某个表中插入 15530 条记录 但出现该错误 我搜索了解决方案 SQLITE MAX COMPOUND SELECT 默认为 500 是原因 但我不知道如何使用 Shell 更改它 错误 复合 S
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • iphone sqlite 静态链接?

    有人静态链接 sqlite 而不是使用动态链接 吗 我遇到的问题是 越狱手机的用户没有与普通 iPhone 所采用的 sqlite 版本相同的版本 因此导致崩溃 我假设在我的应用程序中静态链接已知版本的 sqlite 就是答案 我需要全文支

随机推荐

  • 将 DBF 文件导入 Sql Server

    我需要一些帮助来解决这个问题 因为我是存储过程的新手 我正在尝试使用此存储过程将 DBF 表导入到 Sql Server 2008 中 CREATE PROCEDURE spImportDB Add the parameters for t
  • 使用异常映射器的 JAX-RS

    我读到我可以创建一个实现javax ws rs ext ExceptionMapper它将把抛出的应用程序异常映射到Response目的 我创建了一个简单的示例 如果在保留对象时电话长度大于 20 个字符 该示例将引发异常 我期望异常映射到
  • 如何调整flexdashboard中的表格高度?

    我有一个 Flexdasboard 其中一个页面包含 1 个绘图 然后在其下面有一个表格 该表当前已被压缩 因此虽然它显示 25 行 但它们都在滚动选项中 因此您一次只能查看其中 2 行 我怎样才能改变这个 我目前正在使用以下代码进行编码
  • FluidPage 中的框,基本闪亮

    是否可以在经典闪亮应用程序中使用 box 元素 作为经典应用程序 我的意思是不是闪亮的仪表板 是的 这是可能的 你可以使用使用Shinydashboard https www rdocumentation org packages shin
  • 如何设置rdlc或ssrs报告中表格的最小行数?

    假设我想在表中设置最小行 当我的数据在表中未满时 只需插入空白行即可完全填充它 这个问题看起来很简单 但找到解决方案确实很难 所以我需要在这里分享一下 1 在表格中设置标题和1个绑定明细行 2 在表中插入空白行 只要您想要填充该行 组外 3
  • TCP 套接字到 Websocket?

    那里有很多 websocket gt 套接字包装器 比如网络套接字 https github com kanaka websockify 但是有相反的可用吗 具体来说 我希望能够使用应用程序连接到 TCP 套接字 并将代理转换为 webso
  • 在其他类构造函数中使用参数化构造函数

    我担心这是一个非常基本的问题 但是我还无法解决它 我有一个class A classA h class ClassA public ClassA ClassA int foo private int foo classA cpp Class
  • 如何在KafkaStream应用程序中获取partitionId和TopicName

    我们如何从 KafkaStream 获取主题名称和分区 id 对于任何其他 Kafka 消费者 我们可以获得主题名称和分区 ID 如下所示 ConsumerRecords
  • Excel 添加从 1 开始的列,递增到 24,然后重置 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 数据溢出导致转换失败(数值)

    我试图将数据从 dbf 文件移动到 SQL Server 2008 中的表 但在多个数字列上收到以下错误 链接服务器 null 的 OLE DB 提供程序 MSDASQL 返回消息 多步 OLE DB 操作生成错误 检查每个 OLE DB
  • 还有一个“此 DAG 在网络服务器 DagBag 对象中不可用”

    这似乎是一个相当普遍的问题 我有一个 DAG 我不仅可以手动触发它airflow trigger dag 但它甚至按照其时间表执行 但拒绝显示在 UI 中 我已经多次重新启动网络服务器和调度程序 按 刷新 十亿次 然后运行它airflow
  • 如何获取上一个或最后一个项目?

    如何获取最后一个或上一个或未选择的项目 然后获取新项目JComboBox 我假设这适用于允许您向其添加项目侦听器的所有对象 String items item 1 item 2 item 3 item 4 JComboBox combo n
  • 带有超链接 ActiveDocument.Range 和 Format 的正则表达式

    托比亚斯的回答似乎就是门票 只是想补充一点 我刚刚意识到量词在字符类中毫无意义 还注意到同事的电子邮件通常在数字前面和美元符号后面有一个空格 因此下面是一些更好的正则表达式 对于美元金额 RegExp Pattern s d d 2 从中得
  • 在 ActionScript 中移动数组中的对象,产生体育场波浪效果

    我想移动数组中的所有对象 产生体育场波浪效果 我想根据舞台上的 y 值移动对象 我所有的方块大小都是 50x50 我想将它们向上移动然后向下移动 下面是我的代码 import fl transitions Tween import fl t
  • 无法在项目“Runner.xcodeproj”中找到名为“RunnerTests”的目标

    我的 HP 笔记本电脑上有 hackintosh 我正在尝试在 iOS 模拟器上运行 flutter 应用程序 但它给了我这个错误 Unable to find a target named RunnerTests in project R
  • 在 Jenkins 声明式管道的参数中定义凭证参数?

    我目前使用 Jenkins 声明式管道进行参数化构建 pipeline agent any parameters booleanParam name cleanDB defaultValue false description should
  • 跟进 R# 警告:可能的“System.InvalidOperationException”

    我有以下表达式 其中a AnswerId属于类型long ReSharper 警告可能出现InvalidOperationException在选择功能中 有没有这种情况真的可能发生的情况 极端情况也很好 long ids answers W
  • 模棱两可的出现“只是”

    我是一个绝对的初学者 使用 emacs 浏览 LYAH 我当前的设置 Ubuntu 12 04 LTS 使用体验 初学者 GNU Emacs 23 Use Experience beginner 能够在 haskell 主要模式下工作 发现
  • 使用 SUM 计算运行总计的 T-SQL

    我有一个简单的表 其中包含一些虚拟数据设置 例如 id user value 1 John 2 2 Ted 1 3 John 4 4 Ted 2 我可以通过执行以下 sql MSSQL 2008 语句来选择运行总计 SELECT a id
  • 在 SQL 中仅选择列中重复值的第一行

    我有一个表 其中有一列可能在突发中具有相同的值 像这样 id Col1 1 6050000 2 6050000 3 6050000 4 6060000 5 6060000 6 6060000 7 6060000 8 6060000 9