<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL 去重的 3 種方法?,還有誰不會(huì)?!

          共 2085字,需瀏覽 5分鐘

           ·

          2022-05-15 13:00

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          在使用SQL提數(shù)的時(shí)候,常會(huì)遇到表內(nèi)有重復(fù)值的時(shí)候,比如我們想得到 uv (獨(dú)立訪客),就需要做去重。

          在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函數(shù)的 sql(如Hive SQL、Oracle等等) 中還可以使用 row_number 窗口函數(shù)進(jìn)行去重。

          舉個(gè)栗子,現(xiàn)有這樣一張表 task:

          備注:

          • task_id: 任務(wù)id;
          • order_id: 訂單id;
          • start_time: 開始時(shí)間

          注意:一個(gè)任務(wù)對(duì)應(yīng)多條訂單

          我們需要求出任務(wù)的總數(shù)量,因?yàn)?task_id 并非唯一的,所以需要去重:

          distinct

          --?列出?task_id?的所有唯一值(去重后的記錄)
          --?select?distinct?task_id
          --?from?Task;

          --?任務(wù)總數(shù)
          select?count(distinct?task_id)?task_num
          from?Task;

          distinct 通常效率較低。它不適合用來展示去重后具體的值,一般與 count 配合用來計(jì)算條數(shù)。

          distinct 使用中,放在 select 后邊,對(duì)后面所有的字段的值統(tǒng)一進(jìn)行去重。比如distinct后面有兩個(gè)字段,那么 1,1 和 1,2 這兩條記錄不是重復(fù)值 。

          推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice

          group by

          --?列出?task_id?的所有唯一值(去重后的記錄,null也是值)
          --?select?task_id
          --?from?Task
          --?group?by?task_id;

          --?任務(wù)總數(shù)
          select?count(task_id)?task_num
          from?(select?task_id
          ??????from?Task
          ??????group?by?task_id)?tmp;

          row_number

          row_number 是窗口函數(shù),語法如下:

          row_number()?over?(partition?by?<用于分組的字段名>?order?by?<用于組內(nèi)排序的字段名>)

          其中 partition by 部分可省略。

          --?在支持窗口函數(shù)的?sql?中使用
          select?count(case?when?rn=1?then?task_id?else?null?end)?task_num
          from?(select?task_id
          ???????,?row_number()?over?(partition?by?task_id?order?by?start_time)?rn
          ???from?Task)?tmp;

          此外,再借助一個(gè)表 test 來理理 distinct 和 group by 在去重中的使用:

          --?下方的分號(hào);用來分隔行
          select?distinct?user_id
          from?Test;????--?返回?1;?2

          select?distinct?user_id,?user_type
          from?Test;????--?返回1,?1;?1,?2;?2,?1

          select?user_id
          from?Test
          group?by?user_id;????--?返回1;??2

          select?user_id,?user_type
          from?Test
          group?by?user_id,?user_type;????--?返回1,?1;?1,?2;?2,?1

          select?user_id,?user_type
          from?Test
          group?by?user_id;
          -- Hive、Oracle等會(huì)報(bào)錯(cuò),mysql可以這樣寫。
          --?返回1, 1 或 1, 2 ; 2, 1(共兩行)。只會(huì)對(duì)group by后面的字段去重,就是說最后返回的記錄數(shù)等于上一段sql的記錄數(shù),即2條
          --?沒有放在group?by?后面但是在select中放了的字段,只會(huì)返回一條記錄(好像通常是第一條,應(yīng)該是沒有規(guī)律的)

          原文鏈接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048

          版權(quán)聲明:本文為CSDN博主「米竹」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。








          Spring Boot 定時(shí)任務(wù)開啟后,怎么自動(dòng)停止?
          工作 3 年的同事不知道如何回滾代碼!
          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)
          Spring Boot 保護(hù)敏感配置的 4 種方法!
          再見單身狗!Java 創(chuàng)建對(duì)象的 6 種方式
          阿里為什么推薦使用 LongAdder?
          AnotherRedisDesktopManager 開始收費(fèi)了?
          別再寫爆爆爆炸類了,試試裝飾器模式!
          Java 18 正式發(fā)布,finalize 被棄用。。
          Spring Boot Admin 橫空出世!
          Spring Boot 學(xué)習(xí)筆記,這個(gè)太全了!



          關(guān)注Java技術(shù)棧看更多干貨



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲电影第二页 | 真人一级黄色片 | 无码狠狠躁久久久久久久网址 | 香蕉久久国产AV一区二区 | 青春草在线无码 |