没有聚合的SQL查询

时间:2012-04-03 14:43:38

标签: sql optimization aggregate

所以我的任务是编写一些SQL查询,这些查询涉及在不使用聚合函数的情况下查找分组中的最高值或最低值。例如,我有下表:

年龄:

Name        Age
John        21
Bill        30
Laura       19
Timothy     23
Victoria    29

假设我想查询表格中最老的人(在本例中为Bill),而不使用聚合函数(即计数,组等等)

编辑我也无法在查询中使用分组!在我的第一篇文章中,我没有明确区分,道歉= /

我遇到了麻烦:

SELECT name
FROM Ages
WHERE Ages.Age IN (
SELECT a1.Age
FROM Age a1, Age a2
WHERE a1.Age > a2.Age);

显然我的查询在这里并不好......我想知道是否有人可以指向一个有用的SQL函数或逻辑片段,可以帮助我进行这种类型的查询。

感谢您的帮助。

6 个答案:

答案 0 :(得分:1)

试试这个:

SELECT TOP 1 WITH TIES Name, Age
FROM...
ORDER BY Age ASC


SELECT TOP 1 WITH TIES  Name, Age
FROM...
ORDER BY Age DESC 

答案 1 :(得分:1)

这应该适用于大多数DBMS:

select * from t
where age >= all (select age from t)

小提琴here

答案 2 :(得分:1)

如果您对使用分析功能没有任何限制,可以使用此功能。

select Name, 
       Age
from
  (
    select Name,
           Age,
           rank() over(order by Age desc) rn
    from Ages
  ) T
where rn = 1

答案 3 :(得分:0)

您可以使用子查询和ORDER BY操作。 TOP对SQL Server有效,但对所有RDBMS无效:

SELECT Name
FROM Ages
WHERE Age = (SELECT Top 1 AGE
             FROM Ages
             ORDER BY AGE DESC)

答案 4 :(得分:0)

这是一个非常奇怪的要求(不能使用聚合),所以我有一个非常奇怪的解决方案:

select name,
(select top 1 age from your_table where name=MAIN.name order by age desc) as older,
(select top 1 age from your_table where name=MAIN.name order by age) as newer
from your_table MAIN

答案 5 :(得分:0)

这也应该有效:

select * from t
where not exists (
  select * from t as t2
  where t2.age > t.age
) or not exists (
  select * from t as t2
  where t2.age < t.age
)