27 sql t-sql sql-server aggregate sql-server-2005
我想获得此记录的最大值.请帮我:
SELECT rest.field1
FROM mastertable AS m
INNER JOIN (
SELECT t1.field1 field1,
t2.field2
FROM table1 AS T1
INNER JOIN table2 AS t2 ON t2.field = t1.field
WHERE t1.field3=MAX(t1.field3)
-- ^^^^^^^^^^^^^^ Help me here.
) AS rest ON rest.field1 = m.field
Run Code Online (Sandbox Code Playgroud)
Pow*_*ord 38
正如您所注意到的,该WHERE子句不允许您在其中使用聚合.这就是该HAVING条款的用途.
HAVING t1.field3=MAX(t1.field3)
Run Code Online (Sandbox Code Playgroud)
dla*_*lin 25
您可以使用子查询...
WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)
Run Code Online (Sandbox Code Playgroud)
但我实际上将它从where子句移出到join语句中,作为ON子句的AND.
在having子句中使用max的正确方法是首先执行自连接:
select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)
Run Code Online (Sandbox Code Playgroud)
以下是如何加入子查询:
select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
from table1 t1_max
where t1.id = t1_max.id)
Run Code Online (Sandbox Code Playgroud)
在处理多表连接时,请确保在使用聚合之前创建单个数据集:
select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
on t1.id = t2.id
join table2 t3
on t1.id = t3.id
select a, b, c
from #dataset d
join #dataset d_max
on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c
Run Code Online (Sandbox Code Playgroud)
子查询版本:
select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
on t1.id = t2.id
join table2 t3
on t1.id = t3.id
select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
from #dataset d_max
where d.id = d_max.id)
Run Code Online (Sandbox Code Playgroud)
SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
177313 次 |
| 最近记录: |