获取 SQL Server 中包含最大值的行

Posted

技术标签:

【中文标题】获取 SQL Server 中包含最大值的行【英文标题】:Get row which contains maximum value in SQL Server 【发布时间】:2014-07-19 08:27:48 【问题描述】:

我在 SQL Server 中有一个包含如下销售数据的表。

seq_no  Itemid  Unit    pcs value
------------------------------------   
1       501     101     1   1001.48
1       502     102     2   1004.25
1       502     102     7    987.58
1       503     103     3    787.58
1       503     103     7    647.87
1       503     103     9   1478.58
1       504     104     2    202.25
1       504     104     3    365.87
1       504     104     7    102.25
1       504     104     6    322.22
1       505     105     1   2000.01
1       505     105     2    914.02

现在我想要单位明智的最大值记录。表示当我在seq_no, itemid, unit 上分组并获得 pcs 和 value 的总和时,其给出的结果如下。

逐项总结

seq_no   itemid  unit  pcs   value
------------------------------------
1        501     101    1   1001.48
1        502     102    9   1991.83
1        503     103   19   2914.03
1        504     104   12    992.59
1        505     105    3   2914.03

现在您可以看到,我有两条不同的记录,它们的最大值为 (2914.03)(例如,第 3 条和第 5 条记录)。我需要第三条记录,因为它具有最大数量的最大值。就我而言,我想要以下:

seq_no   itemid  unit  pcs   value
-------------------------------------
1        503     105    19  2914.03

我如何在不影响性能的情况下得到这个结果,因为这个表有这么多行?

【问题讨论】:

按价值+pcs或价值*10000+pcs(如果pcs不超过10000个)排序 第 3 条和第 5 条记录具有不同的单位编号,因此当您检索单位最大值记录时,查询应该没问题。但是,如果您要按 pcs 过滤而不用担心单位编号,那么按 Value 和 pcs 降序排序的 Top 1 应该可以解决问题 @GouriShankarAechoor Backticks are for code,所以请不要将它们用于随机突出显示。 如果3号和5号的pc一样,怎么选? @hvd 有理由强调它,因为我想提醒“单位明智的最大值记录”。无论如何,我会记住以后。感谢您的链接。 【参考方案1】:

试试这个。

查询

SELECT TOP 1 seq_no,
item_id,unit,
SUM(pcs) AS 'pcs',
SUM(value) AS 'value'
FROM tbl1
GROUP BY item_id,seq_no,unit
ORDER BY value DESC,pcs DESC

SQL FIDDLE HERE

【讨论】:

我试过了,效果很好。但我必须将查询用作子查询,并连接许多其他表。并通过不在子查询中工作来订购。我也尝试过窗口功能,但这也有另一个问题。很抱歉在我的问题中忘记了这一点。 所有的努力都白费了? 对此我感到非常抱歉。 @ManishSapkal ORDER BY 在与TOP 结合时在子查询中起作用。 Here's an example. 是什么,具体来说,这对你不起作用? @Manish Sapkal,你为什么认为子查询会影响性能?窗口函数有什么问题?【参考方案2】:
SELECT TOP 1 *
FROM   itemwise_summary
ORDER BY value desc, pcs desc

【讨论】:

【参考方案3】:

试试这个。

WITH res AS  (

SELECT ROW_NUMBER()OVER (ORDER BY seq_no)rnum, 
seq_no,ItemID,unit,SUM(pcs)sum_pcs,SUM(VALUE)sum_val FROM tbl_name 
GROUP BY seq_no,ItemID,unit
)

SELECT TOP  1 * FROM res ORDER BY sum_pcs DESC,sum_val DESC

【讨论】:

【参考方案4】:

试试这个

select max(value),* from table 

【讨论】:

【参考方案5】:

试试,

CREATE TABLE tbl1(seq_no int,item_id int,Unit int,pcs int,value bigint);

insert into tbl1 VALUES(1,501,101,1,1001.48);
insert into tbl1 VALUES(1,502,102,2,1004.25);
insert into tbl1 VALUES(1,502,102,7,987.58);
insert into tbl1 VALUES(1,503,103,3,787.58);
insert into tbl1 VALUES(1,503,103,7,647.87);
insert into tbl1 VALUES(1,503,103,9,1478.58);
insert into tbl1 VALUES(1,504,104,2,202.25);
insert into tbl1 VALUES(1,504,104,3,365.87);
insert into tbl1 VALUES(1,504,104,7,102.25);
insert into tbl1 VALUES(1,504,104,6,322.22);
insert into tbl1 VALUES(1,505,105,1,2000.01);
insert into tbl1 VALUES(1,505,105,2,914.02);
select * from tbl1;



with cte(seq_no,a,b,c,d)as(
select x.seq_no ,x.item_id,x.Unit,sum(x.pcs),sum(x.value) from  (
select seq_no,item_id,Unit,pcs,value ,
ROW_NUMBER() over (partition by unit order by value) as rnk
from tbl1
)x group by  x.seq_no,x.item_id,x.Unit
)select seq_no,sum(a)/5 as item_id,MAX(b)as Unit, MAX(c)as pcs,MAX(d)as value from cte
group by seq_no

这个工作正常,请检查。

【讨论】:

以上是关于获取 SQL Server 中包含最大值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

如何在一行中包含所有最大值?

如何编写一个查询以从SQL Server中包含类似名称的多个表中获取数据

sql server:索引视图包含每组最大的行

如何计算sql中包含非零值的行

复合唯一键约束,其中一列中包含多个空值