網站首頁 美容小常識 享受生活 東方時尚 識真假 高奢 資訊 遊戲攻略 搞笑段子
當前位置:品位站 > 享受生活 > 心理

sql怎麼剔重

欄目: 心理 / 發佈於: / 人氣:4.22K
sql怎麼剔重

在使用SQL提數的時候,常會遇到表內有重複值的時候,比如我們想得到 uv (獨立訪客),就需要做去重。

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

舉個栗子,現有這樣一張表 task:

備註:

task_id: 任務id

order_id: 訂單id

start_time: 開始時間

注意:一個任務對應多條訂單

我們需要求出任務的總數量,因為 task_id 並非唯一的,所以需要去重:

distinct

-- 列出 task_id 的所有唯一值(去重後的記錄)

-- select distinct task_id

-- from Task

-- 任務總數

select count(distinct task_id) task_num

from Task

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

distinct 使用中,放在 select 後邊,對後面所有的字段的值統一進行去重。比如distinct後面有兩個字段,那麼 1,1 和 1,2 這兩條記錄不是重複值 。

group by

-- 列出 task_id 的所有唯一值(去重後的記錄,null也是值)

-- select task_id

-- from Task

-- group by task_id

-- 任務總數

select count(task_id) task_num

from (select task_id

    from Task

    group by task_id) tmp

row_number

row_number 是窗口函數,語法如下:

row_number() over (partition by <用於分組的字段名> order by <用於組內排序的字段名>)

其中 partition by 部分可省略。

-- 在支持窗口函數的 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

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

-- 下方的分號用來分隔行

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等會報錯,mysql可以這樣寫。

-- 返回1, 1 或 1, 2 2, 1(共兩行)。只會對group by後面的字段去重,就是説最後返回的記錄數等於上一段sql的記錄數,即2條

-- 沒有放在group by 後面但是在select中放了的字段,只會返回一條記錄(好像通常是第一條,應該是沒有規律的)

Tags:剔重 sql