2010-06-25 3 views
3

Я пытаюсь построить конкретный SQL-запрос, но я понятия не имею, как реализовать то, что я хочу.
Моя база данных выглядит следующим образом:Сложный запрос SQL

Col1 Col2 
"a" 5 
"b" 7 
"a" 8 
"a" 7 
"b" 5 
"b" 7 
"c" 3 
"a" 4 
"b" 3 
"b" 4 
"c" 1 

И я хочу запрос, который возвращает что-то вроде этого:

"a" 8 
"a" 7 
"b" 7 
"b" 7 

В словах: 2 высших значений первых строк х.

И только предел после сортировки не работает, потому что порядок относится к целому результату, а не к одной «группе» результата. Надеюсь, вы понимаете, что я делаю.

+0

"первые строки х" заказать как? По максимальному col2? – Blorgbeard

+0

да, но это не так важно. вещь, которую я не получаю, - это резка результатов. – Graslandpinguin

ответ

0
select tbl.col1, tbl.col2 from tbl inner join 
(select col2 from tbl order by col2 desc Limit 2) as t1 on 
t1.col2 = tbl.col2 order by tbl.col1,tbl.col2 
+0

он на SQLite, там нет «TOP» – Pentium10

+0

Pentium10, спасибо .. Изменен вопрос – Samiksha

+0

Это не сработает. Проверьте решение @ soren. –

-1

Если вы можете использовать библиотеку более высокого уровня, такую ​​как Hibernate for Java или Spring JDBC. На других языках есть и другие возможности. Не пытайтесь писать SQL в своем приложении, если вы не хотите потерять время.

Редактировать 1: Конечно, у вас может не быть выбора. Вы можете взаимодействовать с тем, что не пишете. Но если вы создаете свой собственный db, когда вы интегрируете низкоуровневые, раздутые, недостижимые SQL-запросы, специфичные для RDBMS, в вашем приложении, это может быть признаком того, что вы делаете что-то неправильно. Я бы предпочел использовать Hibernate и приложение работает немного медленнее, чем тратить время на разработку кода SQL. Я думаю, что «сложный» - это то, чего следует избегать в целом, если вы хотите предоставить реальные, поддерживаемые приложения.

+0

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

+2

@ Matteo Mosca: Я сочувствую, потому что это одна из тех задач, которая не является особенно реляционной (данные не содержат даже ключа!) Однако «Не беспокойтесь о написании SQL в своем приложении» немного обобщение, вам не кажется? – onedaywhen

+0

Ну, я думаю, что если я смогу работать над абстракцией более высокого уровня (скажем, Linq с Entity Framework), которая по-прежнему создает качественный SQL под ним, почему я должен когда-либо писать текст для моего приложения? Разная история, если вам нужно писать sql для других нужд, такие представления должны храниться непосредственно на db, хранимые процедуры и т. Д., Но в настоящее время для приложения .Net, если вы можете использовать Linq и ORM, Sql действительно устарел , Это все равно мое мнение. –

1

Это не красиво, но ..

SELECT * FROM 
    (SELECT DISTINCT col1, 
      (SELECT col2 FROM tbl WHERE tbl.col1 = a.col1 ORDER BY col2 DESC LIMIT 1) FROM tbl a 

    UNION ALL 
    SELECT DISTINCT col1, 
      (SELECT col2 FROM tbl WHERE tbl.col1 = a.col1 ORDER BY col2 DESC LIMIT 1 offset 1) FROM tbl a) 
ORDER BY 1,2 DESC; 
+1

Я должен согласиться с Пьером Гардином. Не беспокойтесь, написав SQL (особенно SQL это уродливое), если вы не хотите потерять/тратить время. Однако я должен восхищаться тем, что вам удалось сделать это так, что это было мое время, а не ваше собственное, что было потрачено впустую. :) – Soren

+1

А, да, хорошо поймать опечатку.По-видимому, я еще не полностью освоил древнее искусство вырезания и пасты. :) – Soren

+0

+1 для древнего художественного комментария. Это будет статус FB дня, надеюсь, что вы не возражаете против моей копии n пасты –