2010-06-25 5 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 

그리고 나는 이런 식으로 뭔가를 반환하는 쿼리를 원하는 : 첫 번째 X 문자열의 2 개 가장 높은 값 : 즉

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

.

정렬 기준은 결과의 한 "그룹"뿐만 아니라 전체 결과를 참조하기 때문에 정렬 후에도 제한을 적용하지 않습니다. 나는 내가 무엇을하는지 이해하기를 바랍니다.

+0

"최초의 X 문자열"어떻게 주문 꽤가 아니라? 최고 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

펜티엄 10, 감사합니다 .. 수정 된 쿼리 – Samiksha

+0

이것은 불행히도 작동하지 않습니다. @ soren의 해결책을 확인하십시오. –

-1

가능한 경우 Java 용 Hibernate 또는 Spring JDBC 템플릿과 같은 상위 수준 라이브러리를 사용하십시오. 다른 언어로는 다른 가능성이 있습니다. 시간을 낭비하지 않으려는 경우를 제외하고는 응용 프로그램에 SQL을 작성하는 것을 방해하지 마십시오.

편집 1 : 물론 선택의 여지가 없습니다. 당신은 쓰지 않은 것을 상호 작용할 수도 있습니다. 그러나 자신 만의 데이터베이스를 만드는 경우 낮은 수준의 비 대한 유지가 불가능한 RDBMS 관련 SQL 쿼리를 응용 프로그램에 통합 할 때 문제가 있다는 신호 일 수 있습니다. 차라리 Hibernate를 사용하고 응용 프로그램을 SQL 코드를 수정하는 개발 시간을 소비하는 것보다 조금 느리게 실행 시키십시오. 실제적이고 유지 보수가 쉬운 응용 프로그램을 제공하고자한다면 "복잡한"것이 일반적으로 피해야 할 사항이라고 생각합니다.

+0

왜 누군가가 이것을 낮추 었는지 이해할 수 없습니다. 그것은 질문에 대답하지 않지만 사용자가 자신의 문제를 해결하기위한 더 나은 접근법을 지적합니다. 내가 부탁하는 사람이라면, 항상 이와 같은 대답을 선호 할 것입니다. –

+2

@Matteo Mosca : 이것은 특히 관계형이 아닌 작업 중 하나이기 때문에 동정합니다 (게시 된 데이터에는 키가 없습니다!). 그러나 "응용 프로그램에서 SQL을 작성하는 것을 귀찮게하지 마십시오."라는 메시지는 약간 있습니다. 일반화, 생각하지 않니? – onedaywhen

+0

글쎄요, 더 높은 수준의 추상화 (엔티티 프레임 워크로 Linq라고 가정 해 봅시다)가 품질 SQL을 여전히 생산하고 있다고 가정 해 봅시다. 왜 필자의 응용 프로그램에서 SQL을 작성해야합니까? 다른 이야기, 당신은 Linq과 ORM을 사용할 수 있다면, DB를, 저장 프로 시저,하지만 요즘. 닷넷 어플 리케이션을 위해 저장하는 등 다른 요구에 대한 SQL을 작성 해야하는 경우 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

필자는 Pierre Gardin에 동의해야합니다. 시간 낭비/낭비를 원하지 않는 한 SQL (특히 SQL은이 추악한)을 쓰는 것에 신경 쓰지 마라. 나는 당신이 그것을 만들 수 있었다는 것을 존경해야한다. 그래서 당신의 자신의 시간보다는 낭비 된 시간이었다. :) – Soren

+1

아, 그래, 오타를 잘 잡아라.분명히 고대의 잘라 붙이기 기술을 완전히 마스터하지 못했습니다. :) – Soren

+0

+1 고대 예술에 대한 코멘트. 그것은 오늘의 FB 상태가 될 것입니다, 당신은 내 사본을 붙여 넣지 않아도되기를 바랍니다. –