實習筆記 2 sql 分組不一定要group by

2021-09-25 18:38:57 字數 1111 閱讀 5426

今天在公司寫**的時候,遇到乙個sql語句構建問題。

情形是這樣的:

我需要獲取不同小組下前n條記錄。

select top 10 * from dbo.topic where groupid in (60034,60037) and state=0  order by crttime desc

很明顯,這是錯的,不僅沒group by,獲取出來的還是按兩個小組的建立時間的前10條資料。

可是,用group by的話,它有個很不通人性的特性。即是——凡是在group by後面出現的字段,必須同時在select後面出現;凡是在select後面出現的、同時未在聚合函式**現的字段,必須同時出現在group by後面。

這樣就讓我不得不放棄使用group by來分組查詢。

後來在網上找到,分組,不一定要用group by來實現。用row_number() over()同樣可以實現。

語法:row_number() over(partition by column order by column)

簡單的說row_number()從1開始,為每一條分組記錄返回乙個數字,這裡的row_number() over (order by xlh desc) 是先把xlh列降序,再為降序以後的沒條xlh記錄返回乙個序號。

row_number() over (partition by col1 order by col2) 表示根據col1分組,在分組內部根據 col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)

有了這麼乙個函式存在,最終我構建了我的sql語句:

select *

from

(select *,row_number() over (partition by groupid order by crttime desc) rank from topic where state=0

) twhere t.rank<=10 and t.groupid in(60034,60040)

實現了這麼乙個功能:從不同的組別(60034,60040)裡獲取到了按建立時間降序排序的各個小組裡的前10條記錄。

章節2 SQL之多表連線

sql的多表連線關係有 內連線 外連線和交叉連線。先建立兩個用於演示的表 tb characters idcharacter1內向 2外向3中性性格 tb colors idcolor1綠色 2紅色4藍色 一 內連線 內連線 join 或 inner join 內連線取交集 示意圖 結果 二 外連線...

資料庫筆記2 SQL運算子

sql運算子例項 教程 運算子是乙個保留字或字元,主要用於在sql語句的where子句來執行,比較和算術運算等操作。運算子是乙個保留字或字元,主要用於在sql語句的where子句來執行,比較和算術運算等操作。運算子用於指定乙個sql語句中的條件,並作為連詞多個條件在乙份宣告中。假設變數的乙個持有值為...

2 SQL的基本書寫規則

對於 sql 初學者,在寫 sql 語句時,只要遵守下面幾個書寫規則,就可以避免很多錯誤。這些規則都非常簡單,下面我們來逐一介紹。在 rdbms 關係型資料庫 當中,sql 語句是逐條執行的,一條 sql 語句代表著資料庫的乙個操作。我們通常在句子的句尾加註標點表示這句話結束,中文句子以句號。結尾,...