mav*_*vnn 8 sql sql-server sqlite ms-access
我有这样一张桌子:
Field1 | Field2 | Field3
1 | 1 | 22
1 | 2 | 10
2 | 5 | 40
2 | 2 | 55
Run Code Online (Sandbox Code Playgroud)
我想按Field1分组,然后使用最小的Field2从行的其余部分获取值,例如:
Field1 | Field2 | Field3
1 | 1 | 22
2 | 2 | 55
Run Code Online (Sandbox Code Playgroud)
请注意,这与选择每行的最小值不同,这将给出:
Field1 | Field2 | Field3
1 | 1 | 10
2 | 2 | 40
Run Code Online (Sandbox Code Playgroud)
哪些与我的数据将是一个毫无意义的结果.
有人有一个通用(即多数据库)解决方案吗?我敢肯定它一定是个问题!
我真的可以使用在sqlite和ms-access中工作的解决方案,而sql server将是一个奖励.
小智 13
您必须使用子查询执行此操作.
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
Run Code Online (Sandbox Code Playgroud)
现在,如果你有一个最小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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,有一种解决方案仅使用标准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
Run Code Online (Sandbox Code Playgroud)
无论如何,你已经有了一个通用的解决方案,所以我只是想我会提供这种替代观点.