Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用group by选择行,并在每个组中根据另一列值中的最高值获取列值_Sql_Sql Server - Fatal编程技术网

Sql 使用group by选择行,并在每个组中根据另一列值中的最高值获取列值

Sql 使用group by选择行,并在每个组中根据另一列值中的最高值获取列值,sql,sql-server,Sql,Sql Server,我需要根据组中的另一个字段获取最新字段 我们有 表学校回顾 身份证件 学生 回顾 指向 1. 1. rv1 8. 2. 1. rv2 7. 3. 2. rv3 4. 4. 2. rv4 7. 5. 3. rv5 2. 6. 3. rv6 8. 您不需要对行进行分组,只需从表中选择适当的行即可。在这种情况下,使用行号是一个选项: 表: SELECT * INTO Data FROM (VALUES (1, 1, 'rv1', 8), (2, 1, 'rv2', 7), (3, 2

我需要根据组中的另一个字段获取最新字段 我们有

表学校回顾

身份证件 学生 回顾 指向 1. 1. rv1 8. 2. 1. rv2 7. 3. 2. rv3 4. 4. 2. rv4 7. 5. 3. rv5 2. 6. 3. rv6 8.
您不需要对行进行分组,只需从表中选择适当的行即可。在这种情况下,使用行号是一个选项:

表:

SELECT *
INTO Data
FROM (VALUES
   (1, 1, 'rv1', 8),
   (2, 1, 'rv2', 7),
   (3, 2, 'rv3', 4),
   (4, 2, 'rv4', 7),
   (5, 3, 'rv5', 2),
   (6, 3, 'rv6', 8)
) v (Id, SchoolId, Review, Point)
声明:

SELECT SchoolId, Review, Point
FROM (
   SELECT *, ROW_NUMBER() OVER (PARTITION BY SchoolId ORDER BY Id DESC) AS Rn
   FROM Data
) t
WHERE Rn = 1
结果:

SchoolId Review Point
---------------------
1        rv2    7
2        rv4    7
3        rv6    8

您不需要对行进行分组,只需从表中选择适当的行即可。在这种情况下,使用行号是一个选项:

表:

SELECT *
INTO Data
FROM (VALUES
   (1, 1, 'rv1', 8),
   (2, 1, 'rv2', 7),
   (3, 2, 'rv3', 4),
   (4, 2, 'rv4', 7),
   (5, 3, 'rv5', 2),
   (6, 3, 'rv6', 8)
) v (Id, SchoolId, Review, Point)
声明:

SELECT SchoolId, Review, Point
FROM (
   SELECT *, ROW_NUMBER() OVER (PARTITION BY SchoolId ORDER BY Id DESC) AS Rn
   FROM Data
) t
WHERE Rn = 1
结果:

SchoolId Review Point
---------------------
1        rv2    7
2        rv4    7
3        rv6    8

使用其他答案的样本数据

SELECT *
INTO #Data
FROM (VALUES
   (1, 1, 'rv1', 8),
   (2, 1, 'rv2', 7),
   (3, 2, 'rv3', 4),
   (4, 2, 'rv4', 7),
   (5, 3, 'rv5', 2),
   (6, 3, 'rv6', 8)
) v (Id, SchoolId, Review, Point)

SELECT S.SchoolId,
       S.Review,
       S.Point 
FROM   #Data S
INNER JOIN
(
    SELECT Id = MAX(S1.Id),
           S1.SchoolId
    FROM   #Data S1
    GROUP BY SchoolId
) X ON X.Id = S.Id AND X.schoolId = S.SchoolId
ORDER BY X.SchoolId    
;
输出


使用其他答案的样本数据

SELECT *
INTO #Data
FROM (VALUES
   (1, 1, 'rv1', 8),
   (2, 1, 'rv2', 7),
   (3, 2, 'rv3', 4),
   (4, 2, 'rv4', 7),
   (5, 3, 'rv5', 2),
   (6, 3, 'rv6', 8)
) v (Id, SchoolId, Review, Point)

SELECT S.SchoolId,
       S.Review,
       S.Point 
FROM   #Data S
INNER JOIN
(
    SELECT Id = MAX(S1.Id),
           S1.SchoolId
    FROM   #Data S1
    GROUP BY SchoolId
) X ON X.Id = S.Id AND X.schoolId = S.SchoolId
ORDER BY X.SchoolId    
;
输出


如果您选中此项,则不会将所需结果SELECT*输入值1、1、'rv1',8、2、1、'rv2',7、3、2、'rv3',4、4、2、'rv4',7、5、3、'rv5',2、6、3、'rv6',8 v Id、SchoolId、Review、Point Go SELECT S.SchoolId、S.Review、S.Point FROM Data S LEFT JOIN SELECT Id=MAXS1.Id的数据中,S1.SchoolId来自数据S1组,按X上的SchoolId X。Id=S。Id听起来效率很低,窗口函数怎么了?@faisal我更新了我的answer@Charlieface这是另一种选择approach@Charlieface现在可以了。感谢如果您选中此项,则不会将所需结果SELECT*输入值1、1、'rv1',8、2、1、'rv2',7、3、2、'rv3',4、4、2、'rv4',7、5、3、'rv5',2、6、3、'rv6',8 v Id、SchoolId、Review、Point Go SELECT S.SchoolId、S.Review、S.Point FROM Data S LEFT JOIN SELECT Id=MAXS1.Id的数据中,S1.SchoolId来自数据S1组,按X上的SchoolId X。Id=S。Id听起来效率很低,窗口函数怎么了?@faisal我更新了我的answer@Charlieface这是另一种选择approach@Charlieface现在可以了。谢谢,谢谢。你建议的脚本工作起来就像一个魔杖。你建议的剧本很有魅力