国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

這篇具有很好參考價(jià)值的文章主要介紹了SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、關(guān)于mysql表中數(shù)據(jù)重復(fù)

關(guān)于刪除mysql表中重復(fù)數(shù)據(jù)問題,本文中給到兩種辦法:聚合函數(shù)、窗口函數(shù)row_number()的方法。
(注意:MySQL從8.0開始支持窗口函數(shù))

測試數(shù)據(jù)準(zhǔn)備:首先創(chuàng)建一個(gè)測試表test,插入一些測試數(shù)據(jù),模擬一些重復(fù)數(shù)據(jù)(最終目標(biāo):刪除重復(fù)數(shù)據(jù),但不處理null行)
SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()
先查詢下重復(fù)數(shù)據(jù),確認(rèn)待處理數(shù)據(jù)的數(shù)量,然后開始處理:

SELECT
        seq_id,
        out_user_code,
        COUNT( out_user_code ) count
FROM
        test
WHERE
        is_deleted = 0
        AND out_user_code IS NOT NULL
GROUP BY
        out_user_code
HAVING
        count( out_user_code )> 1

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

二、聚合函數(shù)min(id)+not in

思路:首先通過子查詢?nèi)〕?id 最小的不重復(fù)行,然后通過 not in 刪除重復(fù)數(shù)據(jù)

1、首先查詢一下 id 最小的不重復(fù)行(我們留下最早插入的數(shù)據(jù),后面的重復(fù)數(shù)據(jù)都刪除):

SELECT
    min(seq_id) seq_id,
	out_user_code,
	COUNT( out_user_code ) count 
FROM
	test 
GROUP BY
	out_user_code 

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

2、通過查詢結(jié)果可知,重復(fù)的數(shù)據(jù)行seq_id為2、7的數(shù)據(jù)過濾掉了,接下來NOT IN 操作應(yīng)該刪除2、7重復(fù)數(shù)據(jù)行。那按照假設(shè)想法執(zhí)行NOT IN:

DELETE from test where r.seq_id not in (
	SELECT
	min(t.seq_id) seq_id
	FROM
		test  t
	GROUP BY
		t.out_user_code
)  r

會(huì)發(fā)現(xiàn)報(bào)錯(cuò):

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'r' at line 8, Time: 0.007000s

原因:不能先select出同一表中的某些值,再update這個(gè)表(在同一語句中),即不能依據(jù)某字段值做判斷再來更新某字段的值。

解決方案:可將SELECT出的結(jié)果再通過中間表SELECT一遍。

3、最終處理sql:

DELETE from test where seq_id not in (
	SELECT r.seq_id from (
		SELECT
		   min(t.seq_id) seq_id
		FROM
			test  t
		GROUP BY
			t.out_user_code
	)  r 
) and out_user_code is not null

換種寫法(保證相關(guān)字段有索引):

DELETE from test 
where
out_user_code in (select * from (select out_user_code from test del group by out_user_code HAVING count(out_user_code) >1)a)
and seq_id not in(select * from (select min(seq_id) id from test del group by out_user_code  HAVING count(out_user_code) >1)b
)f

提醒:能邏輯刪除盡量不要物理刪除。

二、窗口函數(shù)row_number()

思路:通過 PARTITION BY 對(duì)列進(jìn)行分區(qū)排序并生成序號(hào)列,然后將序號(hào)大于 1 的行刪除,row_number() over partition by。

1、分區(qū)查詢:

SELECT
	ROW_NUMBER() OVER ( PARTITION BY out_user_code ORDER BY seq_id ) num,
	out_user_code 
FROM
	test 
WHERE
	out_user_code IS NOT NULL

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

知識(shí)補(bǔ)充:
1、ROW_NUMBER:對(duì)結(jié)果集的輸出進(jìn)行編號(hào),是運(yùn)行查詢時(shí)計(jì)算出的臨時(shí)值。 具體來說,返回結(jié)果集分區(qū)內(nèi)行的序列號(hào),每個(gè)分區(qū)的第一行從 1 開始。
2、ROW_NUMBER() 具有不確定性。除非以下條件成立,否則不保證在每次執(zhí)行時(shí),使用 ROW_NUMBER() 的查詢所返回行的順序都完全相同。
1)分區(qū)列的值是唯一的。
2)ORDER BY 列的值是唯一的。
3)分區(qū)列和 ORDER BY 列的值的組合是唯一的。

2、直接嘗試刪除num>1的數(shù)據(jù):

DELETE a 
FROM (
	SELECT
	 ROW_NUMBER() OVER (PARTITION BY out_user_code ORDER BY seq_id) num 
	FROM test 
	where out_user_code IS NOT NULL
) a 
WHERE num>1

會(huì)發(fā)現(xiàn)報(bào)錯(cuò):
1288 - The target table a of the DELETE is not updatable, Time: 0.007000s

原因同上,同樣的我們換個(gè)方式處理一下。給窗口指定別名:WINDOW w AS (PARTITION BY 字段1 ORDER BY 字段2)

3、最終處理sql:

DELETE
FROM test
WHERE seq_id in (
	SELECT seq_id
	FROM(
		SELECT *
		FROM (
			SELECT ROW_NUMBER() OVER w AS row_num,seq_id
			FROM test  where out_user_code is not null
			WINDOW w AS (PARTITION BY out_user_code ORDER BY seq_id)
		)t
	    WHERE row_num >1
	)e
)

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

四、補(bǔ)充:常見的窗口函數(shù)

SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()

注:‘參數(shù)’列說明該函數(shù)是否可以加參數(shù)?!胺瘛闭f明該函數(shù)的括號(hào)內(nèi)不可以加參數(shù)。
expr即可以代表字段,也可以代表在字段上的計(jì)算,比如sum(col)等。

窗口函數(shù)的一個(gè)概念是當(dāng)前行,當(dāng)前行屬于某個(gè)窗口,窗口由over關(guān)鍵字用來指定函數(shù)執(zhí)行的窗口范圍,如果后面括號(hào)中什么都不寫,則意味著窗口包含滿足where條件的所有行,窗口函數(shù)基于所有行進(jìn)行計(jì)算;如果不為空,則有三個(gè)參數(shù)來設(shè)置窗口:文章來源地址http://www.zghlxwxcb.cn/news/detail-453920.html

  • partition by子句:按照指定字段進(jìn)行分區(qū),兩個(gè)分區(qū)由邊界分隔,窗口函數(shù)在不同的分區(qū)內(nèi)分別執(zhí)行,在跨越分區(qū)邊界時(shí)重新初始化。
  • order by子句:按照指定字段進(jìn)行排序,窗口函數(shù)將按照排序后的記錄順序進(jìn)行編號(hào)??梢院蚿artition by子句配合使用,也可以單獨(dú)使用。
  • frame子句:當(dāng)前分區(qū)的一個(gè)子集,用來定義子集的規(guī)則,通常用來作為滑動(dòng)窗口使用。

到了這里,關(guān)于SQL刪除重復(fù)的記錄(只保留一條)-窗口函數(shù)row_number()的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Mysql 刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)

    ============================== ?Copyright 蕃薯耀?2023-01-31 蕃薯耀的博客_CSDN博客-蕃薯耀分享,java,js領(lǐng)域博主 原理: 根據(jù)字段對(duì)數(shù)據(jù)進(jìn)行分組,查詢出所有分組的最小ID(即要保留的不重復(fù)數(shù)據(jù)) 將查詢出來的數(shù)據(jù)(所有不重復(fù)的數(shù)據(jù))存放到臨時(shí)表中 從原來的表中刪除ID不在臨時(shí)表

    2024年02月16日
    瀏覽(25)
  • SqlServer中根據(jù)某幾列獲取重復(fù)的數(shù)據(jù)將其刪除并保留最新一條

    SqlServer中根據(jù)某幾列獲取重復(fù)的數(shù)據(jù)將其刪除并保留最新一條

    有時(shí)候,我們某個(gè)數(shù)據(jù)表中,可能有幾列的數(shù)據(jù)都是一樣的,此時(shí)我們可能想查詢出這幾列數(shù)據(jù)相同的所有數(shù)據(jù)行,并保留最新一條,將其他重復(fù)的數(shù)據(jù)刪除。 假設(shè)我們有如下數(shù)據(jù)表: 此時(shí)我們可以使用 ROW_NUMBER 函數(shù),根據(jù)某幾列查詢出重復(fù)數(shù)據(jù)的新的排序列,該排序列就

    2024年04月28日
    瀏覽(27)
  • SQL中常用的窗口函數(shù)(排序函數(shù))-row_number/rank/dense_rank/ntile

    SQL中常用的窗口函數(shù)(排序函數(shù))-row_number/rank/dense_rank/ntile

    總結(jié)四個(gè)函數(shù)的特點(diǎn): row_number():連續(xù)不重復(fù);1234567 rank() :重復(fù)不連續(xù);1222567 dense_rank():重復(fù)且連續(xù);1222345 ntile():平均分組;1122334 SQL Server中的排序函數(shù)有四個(gè):row_number(),rank(),dense_rank()及ntile()函數(shù); 特點(diǎn): row_number()函數(shù)可以為每條記錄添加遞增的順序數(shù)值序號(hào),

    2024年02月05日
    瀏覽(42)
  • mysql中去除重復(fù)數(shù)據(jù),只保留一條。

    mysql中去除重復(fù)數(shù)據(jù),只保留一條。

    ? ? ? ? ? ? ? ? 梳理一下關(guān)于刪除重復(fù)記錄的邏輯 目錄 前期準(zhǔn)備:建表插入數(shù)據(jù) 1、通過group by?和count(1)1找出有重復(fù)的數(shù)據(jù) ?2、通過每個(gè)分組中的最小id來去重 ????????2.1、添加主鍵id列 ????????2.2?去重 ????????????????2.2.1、首先找出每個(gè)分組中count

    2024年02月08日
    瀏覽(31)
  • MySQL 聯(lián)表查詢重復(fù)數(shù)據(jù)并刪除(子查詢刪除記錄) SQL優(yōu)化

    數(shù)據(jù)庫表介紹: table_a :主表(小表,表數(shù)據(jù)不可重復(fù)) table_b :流水表(大表,記錄審核流水?dāng)?shù)據(jù)) 注:兩表表結(jié)構(gòu)大致一致,流水表增加一個(gè)審核狀態(tài)的字段 業(yè)務(wù)邏輯: 主表保存唯一數(shù)據(jù),流水表記錄審核流水?dāng)?shù)據(jù),用于后續(xù)展示,并在審核成功后插入主表,在插入流

    2023年04月08日
    瀏覽(30)
  • [hive] 窗口函數(shù) ROW_NUMBER()

    在 Hive SQL 中, ROW_NUMBER() 是一個(gè)用于生成行號(hào)的窗口函數(shù)。 它可以為 查詢結(jié)果集中的每一行分配一個(gè)唯一的行號(hào) 。 以下是 ROW_NUMBER() 函數(shù)的基本語法: PARTITION BY 子句可選,用于指定 分區(qū)列 ,它將結(jié)果集劃分為不同的分區(qū)。 每個(gè)分區(qū)內(nèi)的行都會(huì)有獨(dú)立的行號(hào)計(jì)數(shù),即行號(hào)

    2024年02月07日
    瀏覽(31)
  • git 刪除某一條提交記錄

    git 刪除某一條提交記錄

    1.首先使用git log命令查看提交記錄,找到出錯(cuò)的那一筆提交的commit_id(黃色) ? 2,用命令git?rebase?-i commit_id?,查找提交記錄 ? 3.執(zhí)行(2)命令后出現(xiàn) 如下界面: ?4. 輸入 i 進(jìn)入編輯模式,在要?jiǎng)h除的commitid 前,將pick修改成drop??吹降慕Y(jié)果如下圖: ? 5.編輯完成,按鍵盤Esc,退

    2024年02月11日
    瀏覽(17)
  • sql中的排序函數(shù)dense_rank(),RANK()和row_number()

    sql中的排序函數(shù)dense_rank(),RANK()和row_number()

    dense_rank(),RANK()和row_number()是SQL中的排序函數(shù)。 為方便后面的函數(shù)差異比對(duì)清晰直觀,準(zhǔn)備數(shù)據(jù)表如下: 1.dense_rank() 函數(shù)語法:dense_rank() over( order by 列名 【desc/asc】) DENSE_RANK()是連續(xù)排序,比如遇到相同的數(shù)值時(shí),排序時(shí),是1 2 2 3 序號(hào)連續(xù)的。 按照分?jǐn)?shù)從高到低排名: 按

    2024年02月09日
    瀏覽(21)
  • SQLServer刪除表中重復(fù)記錄

    轉(zhuǎn)載鏈接:https://www.bbsmax.com/A/1O5Ee12G57/ 重復(fù)記錄:有兩個(gè)意義上的重復(fù)記錄 一是完全重復(fù)的記錄,也即所有字段均重復(fù)的記錄; 二是部分段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不一定重復(fù)或都重復(fù)可以忽略。 1、對(duì)于第一種重復(fù),比較容易解決,使用 select d

    2024年02月01日
    瀏覽(25)
  • SQL Server刪除重復(fù)數(shù)據(jù)的方法

    在SQL Server中,有多種方法可以刪除重復(fù)數(shù)據(jù)。下面將介紹幾種常用的方法,并提供相應(yīng)的源代碼示例。 方法一:使用DISTINCT和臨時(shí)表 使用DISTINCT可以去除重復(fù)的行,我們可以將去重后的結(jié)果插入到一個(gè)臨時(shí)表中,然后刪除然后刪除原始表中的數(shù)據(jù),最后將臨時(shí)表中的數(shù)

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包