在 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 中仅选择列中重复值的第一行 的相关文章

  • Python 3 sqlite 参数化 SQL 查询

    我一直在尝试使用 Python 3 和 sqlite 模块进行参数化 SQL 查询 并且仅使用一个变量就成功了 但是 当使用两个变量时 我得到一个IndexError tuple index out of range错误 关于导致此错误的原
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • VS 13/VS 15 - 无法导入 SQL 片段

    我想在中创建 SQL 片段VS2013 and VS2015 我不知道为什么 但我在导入时遇到错误 在两个 VS 中 C sql snippet Missing or unspecified Language attribute 我的片段
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 在 where 子句中使用聚合函数和不同的列条件

    select PO Order Qty Avg PO Order Qty as totalAverage FROM FirstStrike Retail custom Whse Pricing QR where item code 111
  • 如何在事务中使用链接服务器插入远程表?

    我的链接服务器设置正确 我能够执行以下查询 插入 远程服务器 表 SELECT FROM 本地服务器 表 然而当我做同样的事情时交易内 开始传输 插入 远程服务器 表 SELECT FROM 本地服务器 表 提交交易 我收到类似的错误 用于
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 从 json 数组获取值并执行 sql 插入

    这是我的数组 json 1 Device ID a9a3346be4375a92 Date 2012 05 31 Time 15 22 59 Latitude 51 4972912 Longitude 0 1108178 2 Device
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • SQL Server中的列级与表级约束?

    A 列级 GO CREATE TABLE Products ProductID INT CONSTRAINT pk products pid PRIMARY KEY ProductName VARCHAR 25 GO b 表层 CREATE
  • 如何使用 SSIS 将多个 Access 数据库导入到 SQL Server

    我有一个文件夹 其中包含 300 多个 Access 数据库 由我无法控制的程序编写 它们都有相同的结构 只是一张表 我正在将数据导入到 SQL Server 2005 中的表中 使用导入向导效果很好 但它一次只能用于一个 Access 数
  • Postgres LIMIT/OFFSET 奇怪的行为

    我正在使用 PostgreSQL 9 6 我有一个这样的查询 SELECT anon 1 id AS anon 1 id anon 1 is valid AS anon 1 is valid anon 1 first name AS ano
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 如何在 PostgreSQL 中使用条件和子查询创建唯一索引?

    我使用 PGSQL 并尝试添加下面的索引 CREATE UNIQUE INDEX fk client ON user client fk client WHERE fk client NOT IN SELECT fk client FROM
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT

随机推荐

  • 将 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