1. sql分組 取 前兩項,求註解
首先你這個查詢是不對的,後邊的ORDER BY JE應該是ORDER BY JE DESC。
可以看出,查詢出的結果都是按照qu欄位的je從大到小的順序的前兩行,如果你不修改,那麼是從小到大的前兩行,完全是不同的結果。
如果把子查詢的a.qu改成A或者B這些,我想您是可以理解的吧?
這個就是把上邊主查詢a表的qu欄位傳進去了而已。
你可以這么想,先把hard也就是a表的數據全部檢索出來,然後在根據where條件進行篩選。
然後where是什麼,是把a的qu列傳進去,那麼這么多qu列每個傳進去都會有一個結果,最終傳進去的是4個A,3個C,3個B,這樣你就可以把子查詢裡面的a.qu換成實際的值理解了,對於這幾個,得到的結果,其實就是分別每個qu在表中按照je從大到小排序的前兩行的je值。也就是in裡面的最終結合。
2. mysql分組 排序 取前2條
你可以試試這個,有疑問可HI我。
select * from table a
where
(select count(1) from table b
where a.channel_id=b.channel_id and a.time<b.time)<2
order by channel_id,time desc
具體原理可參看我空 間的文章
SQL分類下的《取得分組TOP-N測試表與測試數據》
3. SQL如何對分組後的結果進行排序並且取前幾名
SQL取分組中的前幾名
[sql] www.2cto.com
create table #aa(class varchar(10),name varchar(10),lang int,math int)
go
insert into #aa
select '1','a1',60,70
union all
select '1','a2',80,70
union all
select '1','a3',90,70
union all
select '1','a4',50,70
go
insert into #aa
select '2','b1',60,70
union all
select '2','b2',90,90
union all
select '2','b3',90,70
union all
select '2','b4',50,70
go
select * from #aa
--取每年級前一名的成級
select * from
(select ROW_NUMBER() over(partition by class order by lang+math desc) rr, * from #aa ) a
where rr<2
--取每年級前二名的成級
select * from
(select ROW_NUMBER() over(partition by class order by lang+math desc) rr, * from #aa ) a
where rr<3
4. SQL怎麼取出每個科目前三名並按科目和分組排列
select B1.姓名,B1.科目,B1.分數 from B B1 where(select count(1) from B where 科目=B1.科目 and 分數〉=B1.分數)〈=3 order by B1.科目,B1.分數;
5. 如何在mysql中查詢每個分組的前幾名
可以使用集中方法去解決「每個分組中最大的條目」,這類問題已經進一步擴展到查詢每組中前N個條目的方法。之後我們深入探討了一些MySQL特定的技術,這些技術看起來有一些傻和笨。但是如果你需要榨乾伺服器的最後一點性能,你就需要知道什麼時候去打破規則。對於那些認為這是MySQL本身的問題的人,我要說這不是,我曾經看到過使用其他平台的人也在做著同樣的事情,如SQL Server。在每個平台上都會有很多特殊的小技巧和花招,使用他們的人必須去適應它。
6. sql 分組取每組的前幾條數據 怎麼做
select * from 表名 a where exists (select top 2 * from
(select a,a1,a2 from 表名 group by a,a2) b where a.a=b.a and a.a2=b.a2)
7. SQL 查詢各門成績前兩名的學生
你先抽一條數據來反過來理解這條SQL
比如 你表格里的第一條:陳六、政治
SQL里的子句你把t.subject 替換成 我們這條數據真實的值,就可以看出來
select top 2 stu_id from stu_score where subject='政治' order by score desc
就是查詢我當前這條記錄對應的subject(政治)里,成績最高的兩條數據的 stu_id。
我再提供一種寫法給你
select*from(
selectt1.*,row_number()over()asfidfromstu_score)wherefid<=2
這種寫法主要是row_number() over(partition by subject order by score desc),
意思是:我按照subject 分組,根據score排序從大到小,分別標出序號fid。也就是我把不同subject的成績按從大到小排序,然後外層再取各自的前兩名
8. sql 分組查詢 分組查詢查詢每組的前幾條數據
sqlserver:
select * from (
select *,row_number() over(partition by 分組列 order by 組內排序列) as rn from table
) as a where rn<=2
9. sql取出每個分組的前幾條
一個簡單的方法就是排序之後給它分配序號,根據序號去找前幾條
select*
from(select公司,人數,
--按人數從多到少分配序號,不同公司會重1開始
rank()over(partitionby公司orderby人數desc)asxh
from公司檔案)asA
wherexh<=2--取前幾位就寫幾
orderby公司,人數desc
排序效果如下
10. sql分組後再取前兩位的值
--在這條語句加一個詞desc(表示從大到小排序,不加默認的asc是從小到大)
selecttop2jefromhardbwherea.qu=b.quorderbyjedesc