2010-07-02 5 views
-2

항목 ID (PK), 부모 ID (FK), 이름 및 날짜가있는 항목 테이블이 있다고 가정 해 보겠습니다. 또한 열 ID (PK)와 이름이있는 item_parent 테이블이 있습니다. 항목은 동일한 상위 항목에 속할 수 있거나 항목에 상위 항목이 없을 수 있습니다 (parent_id는 null 일 수 있음).SQL 날짜별로 정렬하지만 외래 키 그룹 유지

SQL 쿼리를 구성하여 날짜순으로 정렬 된 모든 항목 (DESC)을 선택하고 동일한 부모를 공유하는 모든 항목을 유지합니다 (이 경우 항목 모음의 최대 날짜 순).

SELECT * 
FROM itemTable 
ORDER BY parent_id, date desc 

이 선택됩니다 그것을 알고 도움이 경우

, 내가 SQL 서버 2005

답변

0

단일 부모에 대한 항목 그룹 내의 최대 날짜가 정렬되기 때문에 해당 항목을 해당 날짜까지 먼저 정렬 한 다음 여러 항목 (예 : 여러 항목 다른 부모와 동일한 최대 날짜를 공유하는 경우), 동일한 날짜로 정의 된 그룹 내에서 동일한 날짜의 해당 그룹 내의 부모에 따라 정렬합니다.

이 시도 : 부모를 가지지

Select i.* 
    From item i 
     Left Join item_parent p 
      On p.id = i.parentId 
    Order By 
     (Select Max(date) From items 
     Where IsNull(parentId,0) = isNull(i.ParentID, 0)) DESC, 
     i.ParentId, i.Date DESC 

모든 항목이 표시됩니다 함께
편집 :
2ND EDIT (같은 순서 목록에 null의 부모와 모든 항목을 ... 폴드) : 주문에 DESC를 추가하십시오. - 불쾌감은 없지만 이것을 보았어 야합니다!
3 명 편집 : 당신이 실제로 정의가 해당 행에 대한 PARENT_ID에 의해 그룹화 할 경우 이제 실제 항목 날짜 DESC

+0

이것은 작동하지만 부모가없는 항목은 부모가있는 항목과 구분되지 않도록하고 싶습니다 (2 개의 개별 정렬 목록 제공). 나는 그들 모두를 통합하기를 원한다. 이것을 달성하기 위해 수정할 수 있습니까? – richard23

+0

그래, 내가 편집 한대로 작동하는 것 같아 ... –

+0

WHERE 절 (ORDER BY 내의 내부 SELECT)에 다음과 같이 변경하면 완벽하게 매우 근접합니다. WHERE ISNULL (Parent_ID, Item_ID) = ISNULL (I.Parent_ID, I.Item_ID) 한 가지 현저한 문제는 주어진 부모의 항목 모음이 DESC 날짜별로 항상 정렬되지 않는다는 것입니다. – richard23

1

를 사용하고 나는이 질문은 매우 명확하지 않다 당신이 찾고있는 것을 생각 itemTable의 모든 항목 및 항목. parent_id에 1 차 정렬이 있고 가장 오래된 날짜로 2 차 순서가 가장 오래 걸립니다.

아마도 질문을 편집하고 입력 데이터 샘플과 필요한 출력을 게시하여 필요한 것을 정확하게 설명 할 수 있습니까?

+0

나는 전자를 가정한다. – richard23

+2

@ richard23 - 왜이 답변에 모욕을 느낍니까? Stackoverflow _all_ 수준의 개발자를위한 포럼이며, 아마도 당신이 당신의 질문에 당신이 찾고있는 답변의 수준을 설정해야합니다. 나는 항상 내 대답을 설명하려고 노력하므로 많은 사람들이 가능한 한 해결책/대답을 이해합니다. – Oded

0

당신은 한 번에 여러 컬럼에 BY ORDER를 사용할 수 있습니다

SELECT * 
FROM itemtable 
ORDER BY parentID, Date DESC 

은 당신이 찾고있는 무엇인가요?

+0

이것은 모든 동일한 parent_ids를 함께 유지하지는 않습니다. – Oded

+0

@Oded, ORDER BY가하는 것입니다. 왜 이것이 모든 동일한 parent_ids를 함께 유지하지 않는다고 생각합니까? –

+0

@Philip Kelley - 편집하기 전에'ORDER BY 날짜 desc, parentID' – Oded

0

각 상위 그룹 내에서 분류, 당신은 사용할 수 있습니다

select id, parent_id, MAX(date) AS date 
from itemTable 
group by parent_id, coalesce(parent_id, id) 
order by MAX(date) desc 

coalesce는 parent_id가 null 인 경우에만 ID (즉, 그룹핑 없음)로 그룹화 할 수있게합니다. 먼저 원하는 주어진 부모의 내부, 날짜, 다음 먼저 부모에 의해 및 의미하거나 할

select all items ordered by date (DESC), keeping all items that share the same parent together (and in this case, order by the max date of the collection of items).

않습니다

+0

parent_id로 그룹화하고 싶지 않습니다. parent_id와 그것에 속한 모든 개별 하위 항목을 가져 오려고합니다. – richard23

0

당신은 당신이 당신의 품목을 주문하는 방법의 모순의 비트 부모님에 의해 날짜가 표시되면 같은 부모가 함께 나열된 항목을 얻지 못할 수도 있습니다.

Select I.id, I.parent_id, I.name, I.date 
From item As I 
    Left Join item As P 
     On P.id = I.parent_id 
    Outer Apply (
       Select Max(I2.date) As [Date] 
       From item As I2 
       Where I2.Id = I.parent_id 
       ) As MaxDate 
Order By I.parent_Id, MaxDate.[Date] Desc, I.Date Desc 

당신이 다음 왼쪽을 제거 할 수 주어진 항목의 부모로부터 데이터를 반환하는 상관하지 않은 경우

가입 : 나는이 답변에 의해 모욕하고

Select I.id, I.parent_id, I.name, I.date 
From item As I 
    Outer Apply (
       Select Max(I2.date) As [Date] 
       From item As I2 
       Where I2.Id = I.parent_id 
       ) As MaxDate 
Order By I.parent_Id, MaxDate.[Date] Desc, I.Date Desc 
+0

다음과 같은 오류가 발생합니다. "집계는 HAVING 절 또는 선택 목록에 포함 된 하위 쿼리에 있고 집계중인 열이 외부 참조가 아니면 ON 절에 나타날 수 없습니다." 또한 I1은 정의되지 않았습니다. – richard23

+0

또한 이전에 가정 한 내용이 정확합니다. – richard23

+0

@ richard23 - 두 가지 문제점 모두 외부 적용 쿼리의 오타가 원인이라고 생각합니다. 내 게시물을 수정했습니다. – Thomas