sql如果有重复数据,怎么根据需要去重,比如no相同,优先保留code为b的
五条数据四条code a 一条code b 其中code b的no和code a重复了,最后应该是四条数据,其中三条code a一条code b
sql如果有重复数据,怎么根据需要去重,比如no相同,优先保留code为b的
五条数据四条code a 一条code b 其中code b的no和code a重复了,最后应该是四条数据,其中三条code a一条code b
在SQL中,如果你需要根据特定条件去重并保留特定条件的记录(如你提到的no
相同的情况下优先保留code
为b
的记录),你可以使用ROW_NUMBER()
窗口函数或者RANK()
窗口函数结合OVER()
子句来实现。这里,使用ROW_NUMBER()
可能更合适,因为它能为每个分组内的行分配一个唯一的序号,基于你指定的排序顺序。
下面是一个具体的SQL示例,假设你的表名为your_table
,它包含no
和code
两列:
WITH RankedData AS (
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY no ORDER BY CASE WHEN code = 'b' THEN 1 ELSE 2 END, code) AS rn
FROM
your_table
)
SELECT
no,
code
FROM
RankedData
WHERE
rn = 1;
WITH RankedData AS (...)
)来首先处理原始数据。CTE是SQL中的一种临时结果集,它在查询执行期间存在。ROW_NUMBER()
函数用于为分区内的每一行分配一个唯一的序号。PARTITION BY no
表示我们按照no
列的值将数据分组,即每个no
值对应一组数据。ORDER BY CASE WHEN code = 'b' THEN 1 ELSE 2 END, code
表示在每个分组内,我们首先按照code
是否为b
进行排序(b
排在前面),如果code
相同,则按code
本身的值排序(这里主要是为了保证排序的稳定性,虽然在这个场景下可能不需要)。no
和code
列,但只选择那些rn = 1
的行,即每个no
分组中序号为1的行,也就是根据我们的排序规则,首先被排序出来的行(即code
为b
的行,如果存在的话)。这样,你就可以根据no
去重,并在每个no
分组中优先保留code
为b
的记录(如果存在),否则保留其他code
的记录。
SELECT no,code FROM(
SELECT no,code,ROW_NUMBER()OVER(PARTITION BY no ORDER BY code desc) rn
FROM table)a WHERE rn = 1;
6 回答3.3k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
4 回答2k 阅读
2 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答2.5k 阅读
按照no分组,然后组内排序。存在code a和code b,使code b为组内第一条。取每个分组的第一条