Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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表中选择多个最大值_Sql_Sql Server - Fatal编程技术网

如何从sql表中选择多个最大值

如何从sql表中选择多个最大值,sql,sql-server,Sql,Sql Server,我试图从一个表中选出表现最好的人,按公司分组,但似乎无法正确分组 我曾尝试使用子查询,但这超出了我的知识范围 我试图进行一个查询,选择绿色的行。换言之,我想包括名字、公司以及他们支付的费用,但只包括每家公司的顶级员工 这是原始数据 创建表测试(person varchar(50)、company varchar(50)、paid numeric); 插入 试验 价值观 ('bob','a',200), ('jane','a',100), (‘马克’、‘a’、350), ('susan','b'

我试图从一个表中选出表现最好的人,按公司分组,但似乎无法正确分组

我曾尝试使用子查询,但这超出了我的知识范围

我试图进行一个查询,选择绿色的行。换言之,我想包括名字、公司以及他们支付的费用,但只包括每家公司的顶级员工

这是原始数据

创建表测试(person varchar(50)、company varchar(50)、paid numeric);
插入
试验
价值观
('bob','a',200),
('jane','a',100),
(‘马克’、‘a’、350),
('susan','b',650),
('thabo','b',100),
('thembi','b',210),
('lucas','b',110),
('oscar','c',10),
('janet','c',20),
('nancy','c',30)
这是您的问题

select a.person, a.company, a.paid from tableA a 
inner join
(select person, company, row_number() over (partition by company order by paid desc) as rn from tableA) as t1
on t1.person = a.person and t1.company = a.company
where t1.rn = 1
也许像

WITH ranked AS (SELECT person, company, paid
                     , rank() OVER (PARTITION BY company ORDER BY paid DESC) AS rnk
                FROM yourtable)
SELECT person, company, paid
FROM ranked
WHERE rnk = 1
ORDER BY company;
您可以在子查询中使用
MAX()
,如下所示:

CREATE TABLE T(
  Person VARCHAR(45),
  Company CHAR(1),
  Paid INT
);

INSERT INTO T 
  VALUES ('Person1', 'A', 10),
         ('Person2', 'A', 20),
         ('Person3', 'B', 10);

SELECT T.*
FROM T INNER JOIN
(
  SELECT Company, MAX(Paid) Paid
  FROM T
  GROUP BY Company
) TT ON T.Company = TT.Company AND T.Paid = TT.Paid;

或者使用窗口函数作为

SELECT Person,
       Company,
       Paid
FROM 
(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY Company ORDER BY Paid DESC) RN
  FROM T
) TT
WHERE RN = 1;

您可以使用带有partition by子句的
rank()
函数。
densite\u RANK
提供有序分区内的排名,但排名是连续的。如果存在包含多个项目的列组,则不会跳过任何列组

   WITH cte AS (
            SELECT person, company, paid
               rank() OVER (PARTITION BY company ORDER BY paid desc) rn
            FROM  yourtable

        )

        SELECT
            *
        FROM cte

请将您的样本数据直接作为文本包含在问题中(最好是作为
创建表
插入
语句以便于导入),而不是作为图像。请在问题中包含您的尝试;如果我们看不到你的尝试,我们就无法告诉你哪里出了问题。请不要以图片形式提供样本数据;提供格式为
文本(或DDL和DML语句),以及预期结果。请更新您的帖子,以便我们可以帮助您。谢谢。你能解释一下为什么使用where子句“RN=1”吗?