2012-04-03 3 views
0

Итак, мне поручено написать несколько SQL-запросов, которые включают поиск наивысшего или самого низкого значения в группе без использования агрегатных функций. Например, у меня есть следующая таблица:SQL-запрос без агрегатов

Ages:

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

Say Я хотел запросить старейший человек в таблице (в этом случае Билл) без использования агрегатных функций (т.е. рассчитывать, группы, и т.д. ...)

EDIT Я также не могу использовать группировки в своих запросах! Я не делал это различие очень ясно в моем первом посте, мои извинения =/

У меня возникли проблемы при получении мимо:

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

Очевидно мой запрос не здесь хорошо ... Я был интересно, может ли кто-нибудь указать мне в сторону полезной функции SQL или части логики, которая могла бы помочь мне в этом типе запроса.

Благодарим за помощь.

+0

Как насчет ORDER BY? В случае, если вам нужен один результат, просто используйте ограничение на выход или строку (.. где rownum <= 1 .. для oracle, ... limit 1 ... для mysql и т. Д.). –

+0

Btw, group by не является агрегированной функцией. –

ответ

1

Это должно работать в большинстве СУБД:

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

Fiddle here

0

Вы можете использовать подзапросы для этого и операцию ORDER BY. TOP действительна для SQL Server, но не для всех СУБД:

SELECT Name 
FROM Ages 
WHERE Age = (SELECT Top 1 AGE 
      FROM Ages 
      ORDER BY AGE DESC) 
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 
+0

Я предпочитаю подзапрос, потому что, если бы была связь по возрасту, ваш запрос показывал бы только одну из строк, а не как – JNK

+2

@JNK. Вы можете добавить [со связями] (http://technet.microsoft.com/en -us/library/ms189463.aspx), чтобы позаботиться об этом. И я предполагаю, что это будет работать только в SQL Server. –

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 
1

Если у вас нет каких-либо ограничений с помощью аналитических функций, вы можете использовать это.

select Name, 
     Age 
from 
    (
    select Name, 
      Age, 
      rank() over(order by Age desc) rn 
    from Ages 
) T 
where rn = 1 
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 
) 
Смежные вопросы