① sql取出每個分組的前幾條
一個簡單的方法就是排序之後給它分配序號,根據序號去找前幾條
select*
from(select公司,人數,
--按人數從多到少分配序號,不同公司會重1開始
rank()over(partitionby公司orderby人數desc)asxh
from公司檔案)asA
wherexh<=2--取前幾位就寫幾
orderby公司,人數desc
排序效果如下
② sql 取分組 最小值
select USERTYPE from CONFIG_USER group by USERTYPE ORDER BY USERTYPE DESC
先分組再排序 取第一個就行了
③ SQL分組查詢取第一條數據
我們在查詢數據時,經常會使用distinct去重,但使用distinct只能去除所有查詢列都相同的記錄,如果所查詢列中有一個欄位值不同,distinct是無法去重的。但我們還想要實現這樣的效果,這時我們可以用partition by。
1.例如,我們新建一張學生成績表。
2.插入一些測試數據。
3.例如我們需要查詢每個科目不同的分數,這時候可以用到distinct:
4.但是我們把需求再加一點,需要查詢每個科目排名第一的學生信息,這時候就需要用到partition by:
PS:MySQL5.6不支持partition by
此時我們發現,並且第一的小明同學的英語成績沒有被查詢出來,接著優化:
④ 請教一個sql(按2個欄位分組然後從每組取出最大的一條紀錄,再根據一個標記為判斷是否取出該值)
CREATETABLE#test(
idINT,
[number]varchar(6),
deptvarchar(6),
[date]int,
flagint
);
GO
INSERTINTO#test
SELECT1,'001','aa',20130201,1UNIONALL
SELECT2,'001','aa',20120801,0UNIONALL
SELECT3,'001','bb',20130403,1UNIONALL
SELECT4,'001','bb',20120404,0UNIONALL
SELECT5,'001','cc',20120604,0UNIONALL
SELECT6,'002','aa',20130201,1UNIONALL
SELECT7,'002','aa',20120801,0UNIONALL
SELECT8,'002','bb',20130403,1UNIONALL
SELECT9,'002','bb',20120404,0UNIONALL
SELECT10,'002','cc',20120604,1
GOSELECT
main.*
FROM
#testmain
WHERE
NOTEXISTS(
SELECT1
FROM#testsub
WHEREmain.[number]=sub.[number]ANDmain.[dept]=sub.[dept]ANDmain.[id]>sub.[id]
);
GO
idnumberdeptdateflag
---------------------------------------------
1001aa201302011
3001bb201304031
5001cc201206040
6002aa201302011
8002bb201304031
10002cc201206041
(6行受影響)
WithMyCTEAS(
SELECT
main.*
FROM
#testmain
WHERE
NOTEXISTS(
SELECT1
FROM#testsub
WHEREmain.[number]=sub.[number]ANDmain.[dept]=sub.[dept]ANDmain.[id]>sub.[id]
)
)
SELECT
[number],MAX([date])ASdate
FROM
MyCTE
GROUPBY
[number]
HAVING
SUM(CASEWHENflag=1THEN1ELSE0END)=COUNT(flag);
GO
numberdate
-----------------
00220130403
(1行受影響)
⑤ sql語句 如何分組後得到記錄總數
SELECT COUNT(*)
FROM (SELECT 分組欄位 FROM 表
GROUP BY 分組欄位
)別名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分組欄位 FROM 表)別名
(5)sql分組取出擴展閱讀:
SQL分組查詢
在SQL Server中使用的分組查詢是ORDER BY子句,使用ORDER BY子句要同聚合函數配合使用才能完成分組查詢,在SELECT查詢的欄位中如果欄位沒有使用聚合函數就必須出現在ORDER BY子句中(即SELECT後邊的欄位名要麼出現在聚合函數中,要麼在ORDER BY子句中使用)
在分組查詢中還可以配合使用HAVING子句,定義查詢條件。
使用group by進行分組查詢
在使用group by關鍵字時,在select列表中可以指定的項目是有限制的,select語句中僅許以下幾項:
1、被分組的列
2、為每個分組返回一個值得表達式,例如用一個列名作為參數的聚合函數
3、group by 有一個原則,就是 select 後面的所有列中,沒有使用聚合函數的列,必須出現在 group by 後面
⑥ SQL查詢取分組最大值
selectt1.分類,t1.商品名稱,table.庫存,t1.更新時間
from (
select 分類,商品名稱,max(更新時間) 更新時間 from table
group by 分類,商品名稱
) t1
inner join table on t1.分類=table.分類 and t1.商品名稱=table.商品名稱 and t1.更新時間
=table.更新時間
(6)sql分組取出擴展閱讀:
關於SQL最大值查詢語句的記錄
SELECT
bsnum,
STATE AS FILE_STATE
FROM
FILE_RECORD r
WHERE
STATE =(
SELECT
MAX(STATE)
FROM
FILE_RECORD
WHERE
bsnum = r.bsnum
);
小技巧:有時需要測試sql語法但又覺得創建表麻煩,可以使用創建一個臨時表,如下:
select id, count(t.id) from
(
select 1 as id, 2 as age, 'F' as sex from al union
select 2 as id, 2 as age, 'M' as sex from al union
select 3 as id, 3 as age, 'F' as sex from al union
select 4 as id, 4 as age, 'M' as sex from al
)t