用sql语句在表A中分组内排序,排序后取前N个,其中N由另一个表B的一个字段决定(N为不同值)

时间:2022-10-01 15:06:36
在表A中分组内排序,排序后取前N个,其中N由另一个表B的一个字段决定(N为不同值),求使用sql语句实现。

5 个解决方案

#1


类似sql :
SELECT g2.*
FROM   (
           SELECT TOP(
                      SELECT COUNT(1)
                      FROM   test01
                  ) g.id,
                  COUNT(g.ID) AS gID 
           FROM   Graph g
           GROUP BY
                  g.ID
       ) AS t
       INNER JOIN Graph g2
            ON  g2.id = t.id


如果你觉得不配套, 把你的表结构贴出来!

#2


select * from (select *,rowindex=row_number()over(partition by flag order by id) from url)t where t.rowindex<=5

分组之后每组取前五条记录

#3



引用 1 楼 yenange 的回复:
类似sql :
SQL code?12345678910111213SELECT g2.*FROM   (           SELECT TOP(                      SELECT COUNT(1)                      FROM   test01                  ) g.id,              ……


比如说 表A
  ID     姓名     成绩    志愿班级
001      **        98        1班
002      **        96        1班
003      **        85        1班
004      **        95        2班
005      **        65        3班
006      **        88        2班
007      **        69        1班
008      **        76        3班
009      **        78        3班
010      **        93        2班



表B
班级       录取人数
1班              3
2班              4
3班              5

怎么从表A中挑出表B中要求的人数呢?

#4


引用 3 楼 Dawn14 的回复:
引用 1 楼 yenange 的回复:类似sql :
怎么从表A中挑出表B中要求的人数呢? 



--表A
-- ID     姓名     成绩    志愿班级
--001      **        98        1班
--002      **        96        1班
--003      **        85        1班
--004      **        95        2班
--005      **        65        3班
--006      **        88        2班
--007      **        69        1班
--008      **        76        3班
--009      **        78        3班
--010      **        93        2班

--表B
--班级       录取人数
--1班              2
--2班              1
--3班              2

--怎么从表A中挑出表B中要求的人数呢?

--0. 建立初始环境, 插入数据等. 
--建立表变量 ( 相当于你的真实表 )
DECLARE @A TABLE ( StuID VARCHAR(3), StuName VARCHAR(50), Score INT, StuClass VARCHAR(10))
DECLARE @B TABLE ( StuClass VARCHAR(10), AdmissionNumber INT)
--插入数据
INSERT INTO @A
SELECT '001','王小1',75,'1班' union
SELECT '002','王小2',96,'1班' union
SELECT '003','王小3',85,'1班' union
SELECT '004','王小4',95,'2班' union
SELECT '005','王小5',65,'3班' union
SELECT '006','王小6',88,'2班' union
SELECT '007','王小7',69,'1班' union
SELECT '008','王小8',76,'3班' union
SELECT '009','王小9',78,'3班' union
SELECT '010','王大0',93,'2班'
--插入数据
INSERT INTO @B
SELECT '1班',2 union
SELECT '2班',1 union
SELECT '3班',2 
--查看原表中数据
SELECT * FROM @A
SELECT * FROM @B

--1. 查询
--建立两临时表变量
DECLARE @TempA TABLE ( StuID VARCHAR(3), StuName VARCHAR(50), Score INT, StuClass VARCHAR(10))
DECLARE @TempB TABLE ( RowNum INT, StuClass VARCHAR(10), AdmissionNumber INT)
--给班级临时表加入行号
INSERT INTO @TempB 
SELECT ROW_NUMBER() OVER (ORDER BY StuClass),StuClass,AdmissionNumber FROM @B 
--为循环变量赋值
DECLARE @rowId INT,@rowMax INT
SET @rowId=1
SELECT @rowMax=MAX(rownum) FROM @TempB
--遍历每个班级,将适合条件的插入到 录取表 @TempA 中
WHILE (@rowId<=@rowMax)
BEGIN
INSERT INTO @TempA
SELECT TOP (SELECT AdmissionNumber FROM @TempB WHERE rownum = @rowId)
 * FROM @A WHERE StuClass IN (SELECT stuclass FROM @TempB WHERE rownum = @rowId)
ORDER BY Score DESC
SET @rowId=@rowId+1
END
--查询最后结果
SELECT * FROM @TempA

#5


真是晕死了, 结贴都不会呀……
用sql语句在表A中分组内排序,排序后取前N个,其中N由另一个表B的一个字段决定(N为不同值)

#1


类似sql :
SELECT g2.*
FROM   (
           SELECT TOP(
                      SELECT COUNT(1)
                      FROM   test01
                  ) g.id,
                  COUNT(g.ID) AS gID 
           FROM   Graph g
           GROUP BY
                  g.ID
       ) AS t
       INNER JOIN Graph g2
            ON  g2.id = t.id


如果你觉得不配套, 把你的表结构贴出来!

#2


select * from (select *,rowindex=row_number()over(partition by flag order by id) from url)t where t.rowindex<=5

分组之后每组取前五条记录

#3



引用 1 楼 yenange 的回复:
类似sql :
SQL code?12345678910111213SELECT g2.*FROM   (           SELECT TOP(                      SELECT COUNT(1)                      FROM   test01                  ) g.id,              ……


比如说 表A
  ID     姓名     成绩    志愿班级
001      **        98        1班
002      **        96        1班
003      **        85        1班
004      **        95        2班
005      **        65        3班
006      **        88        2班
007      **        69        1班
008      **        76        3班
009      **        78        3班
010      **        93        2班



表B
班级       录取人数
1班              3
2班              4
3班              5

怎么从表A中挑出表B中要求的人数呢?

#4


引用 3 楼 Dawn14 的回复:
引用 1 楼 yenange 的回复:类似sql :
怎么从表A中挑出表B中要求的人数呢? 



--表A
-- ID     姓名     成绩    志愿班级
--001      **        98        1班
--002      **        96        1班
--003      **        85        1班
--004      **        95        2班
--005      **        65        3班
--006      **        88        2班
--007      **        69        1班
--008      **        76        3班
--009      **        78        3班
--010      **        93        2班

--表B
--班级       录取人数
--1班              2
--2班              1
--3班              2

--怎么从表A中挑出表B中要求的人数呢?

--0. 建立初始环境, 插入数据等. 
--建立表变量 ( 相当于你的真实表 )
DECLARE @A TABLE ( StuID VARCHAR(3), StuName VARCHAR(50), Score INT, StuClass VARCHAR(10))
DECLARE @B TABLE ( StuClass VARCHAR(10), AdmissionNumber INT)
--插入数据
INSERT INTO @A
SELECT '001','王小1',75,'1班' union
SELECT '002','王小2',96,'1班' union
SELECT '003','王小3',85,'1班' union
SELECT '004','王小4',95,'2班' union
SELECT '005','王小5',65,'3班' union
SELECT '006','王小6',88,'2班' union
SELECT '007','王小7',69,'1班' union
SELECT '008','王小8',76,'3班' union
SELECT '009','王小9',78,'3班' union
SELECT '010','王大0',93,'2班'
--插入数据
INSERT INTO @B
SELECT '1班',2 union
SELECT '2班',1 union
SELECT '3班',2 
--查看原表中数据
SELECT * FROM @A
SELECT * FROM @B

--1. 查询
--建立两临时表变量
DECLARE @TempA TABLE ( StuID VARCHAR(3), StuName VARCHAR(50), Score INT, StuClass VARCHAR(10))
DECLARE @TempB TABLE ( RowNum INT, StuClass VARCHAR(10), AdmissionNumber INT)
--给班级临时表加入行号
INSERT INTO @TempB 
SELECT ROW_NUMBER() OVER (ORDER BY StuClass),StuClass,AdmissionNumber FROM @B 
--为循环变量赋值
DECLARE @rowId INT,@rowMax INT
SET @rowId=1
SELECT @rowMax=MAX(rownum) FROM @TempB
--遍历每个班级,将适合条件的插入到 录取表 @TempA 中
WHILE (@rowId<=@rowMax)
BEGIN
INSERT INTO @TempA
SELECT TOP (SELECT AdmissionNumber FROM @TempB WHERE rownum = @rowId)
 * FROM @A WHERE StuClass IN (SELECT stuclass FROM @TempB WHERE rownum = @rowId)
ORDER BY Score DESC
SET @rowId=@rowId+1
END
--查询最后结果
SELECT * FROM @TempA

#5


真是晕死了, 结贴都不会呀……
用sql语句在表A中分组内排序,排序后取前N个,其中N由另一个表B的一个字段决定(N为不同值)