2013-08-26 2 views
-1

'inventory'테이블이 있다고 가정 해 봅시다. 매일 매일 항목과 수량을 나열합니다.SQL의 행 그룹에 의한 중복 제거 방법

inventory 
--------------------- 
day | item | quantity 
1 Apples 5 
1 Oranges 3 
2 Apples 5 
2 Oranges 3 
3 Apples 5 
3 Oranges 3 
3 Peaches 8 
4 Apples 5 
4 Oranges 3 
4 Peaches 8 
5 Apples 2 
5 Oranges 3 
5 Peaches 8 

중복 제거를 사용하면 전날과 완전히 동일한 데이터가있는 날짜를 제거하고 싶습니다. 결과 테이블은 다음과 같아야합니다 :

inventory 
--------------------- 
day | item | quantity 
1 Apples 5 
1 Oranges 3 
3 Apples 5 
3 Oranges 3 
3 Peaches 8 
5 Apples 2 
5 Oranges 3 
5 Peaches 8 

어떻게해야합니까?

+1

원하는 결과에 "3, 사과, 5"가 포함됩니다. 행 (및 다른 일부)이 원하는 결과에 있어야합니까? 전날의 다른 행 "2, 사과, 5"가 있기 때문에. – supergrady

+0

예. 3 일차가 변경되었으므로 3 일째부터 모든 행이 결과 집합에 있어야합니다. – satnam

+0

일부 답변을 한 후에 OP에서 질문을 변경했습니다. –

답변

1

, 당신은 다음과 같이 쿼리를 사용할 수 있습니다

SELECT 
    i.day, i.item, i.quantity 
FROM (
    SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day 
    FROM 
    inventory t1 LEFT JOIN inventory t2 
    ON t1.item=t2.item AND t1.day>t2.day 
    GROUP BY 
    t1.day, t1.item, t1.quantity) i 
    LEFT JOIN inventory i2 
    ON i.item=i2.item AND i.prec_day=i2.day 
WHERE 
    i2.day IS NULL or i.quantity<>i2.quantity 

here 바이올린을 참조하십시오.

편집 : 당신이 적어도 하나의 변화가있을 때마다 모든 항목을 표시해야하는 경우, 당신은이를 사용할 수 있습니다

SELECT 
    inventory.* 
FROM 
    inventory 
WHERE 
    day IN (
    SELECT 
     i.day 
    FROM (
     SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day 
     FROM 
     inventory t1 LEFT JOIN inventory t2 
     ON t1.item=t2.item AND t1.day>t2.day 
     GROUP BY 
     t1.day, t1.item, t1.quantity) i 
     LEFT JOIN inventory i2 
     ON i.item=i2.item AND i.prec_day=i2.day 
    WHERE 
     i2.day IS NULL or i.quantity<>i2.quantity) 

바이올린은 here입니다.

+0

이 정확한지는 모르겠지만 지금은 어떻게 작동하는지 알아 내려고 노력하고있어 실제 문제 (좀 더 복잡함)에 적용 할 수 있습니다. 고맙습니다 – satnam

0

는 뭔가처럼 생각합니다.

select day, item, quantity 
from yourTable t 
where quantity <> (select quantity from yourTable y where y.day = t.day - 1 and y.item = t.item) 

적어도 테스트했을 때 효과적이었습니다.

0

다음 솔루션은 통합 된 하위 선택을 사용합니다

Select day, (Select Item, Quantity From tables Where Criteria) From tables Where Criteria Group By Day. 

이 작동 :

+0

흠, 매일 매일 데이터가있는 경우 작동합니다. 데이터가 누락 된 날이있을 수 있습니다. 따라서 7 일째와 8 일째가 빠진 경우 9 일째는 6 일째인지 확인하여 중복인지 확인해야합니다. – satnam

0

LEFT JOIN을 사용하면 전날과 동일한 인벤토리 항목을 찾고 WHERE 절에서 제외 할 수 있습니다. 다음은 SQLFiddle입니다. 일부 누락 된 일을 고려할 경우

SELECT 
    inv.day 
    ,inv.item 
    ,inv.quantity 
FROM inventory AS inv 
LEFT JOIN inventory AS prev_day 
    ON prev_day.day = inv.day - 1 
    AND prev_day.item = inv.item 
    AND prev_day.quantity = inv.quantity 
WHERE prev_day.day IS NULL 
+0

유일한 문제는 행별로 행이 아닌 오늘부터 행해지려고 노력하고 있다는 것입니다. 결과 집합과 원하는 결과 집합의 차이점에 주목하십시오. – satnam