当前位置:  开发笔记 > 数据库 > 正文

如何在表的一个字段中按最小值分组,保留同一行中的所有值?

如何解决《如何在表的一个字段中按最小值分组,保留同一行中的所有值?》经验,为你挑选了2个好方法。

我有这样一张桌子:

Field1 | Field2 | Field3
1      | 1      | 22
1      | 2      | 10
2      | 5      | 40
2      | 2      | 55

我想按Field1分组,然后使用最小的Field2从行的其余部分获取值,例如:

Field1 | Field2 | Field3
1      | 1      | 22
2      | 2      | 55

请注意,这与选择每行的最小值不同,这将给出:

Field1 | Field2 | Field3
1      | 1      | 10
2      | 2      | 40

哪些与我的数据将是一个毫无意义的结果.

有人有一个通用(即多数据库)解决方案吗?我敢肯定它一定是个问题!

我真的可以使用在sqlite和ms-access中工作的解决方案,而sql server将是一个奖励.



1> 小智..:

您必须使用子查询执行此操作.

Select * from 
 yourtable t
  inner join 
    (   Select field1, min(field2) as minField2 
        from yourtable 
        group by field1
     ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2

现在,如果你有一个最小field2值的多行,那么你将有dupes ...如果你不想要那个(即你想要field2的每个最小值的field3的最小值),那么你需要另一个子查询:

Select outert.field1, outert.field2, outert.field3
from yourtable outert 
inner join 

( 
 Select t.field1, xx.minfield2, min(field3) as minfield3 from 
 yourtable t
  inner join 
    (   Select field1, min(field2) as minField2 
        from yourtable 
        group by field1
     ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2
 group by t.field1, xx.minfield2
) outerx
on outerx.field1 = outert.field1 
and outerx.field2 = outert.minfield2
and outerx.field3 = outert.minfield3 



2> Mark Byers..:

正如您所看到的,有一种解决方案仅使用标准SQL,但它很长且很复杂.

请注意,也可以写一个"Hello,world!" 程序在三种不同的编程语言中正常工作.这样做通常不会为您的程序增加任何价值.根据每种语言的特定语法量身定制三次编程程序要容易得多.

我认为使用SQL通常最好忘记尝试找到适用于所有RDBMS的解​​决方案,并使用特定的供应商扩展和习惯用法使这样的查询更容易.例如,在MS SQL Server中,您可以执行以下操作:

SELECT Field1, Field2, Field3
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn
    FROM table1
) AS T1
WHERE rn = 1

无论如何,你已经有了一个通用的解决方案,所以我只是想我会提供这种替代观点.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有