2012-01-23 2 views
0

이것은 쉽게 할 수 있지만 항목별로 가격을 나열하고 각 항목의 버전 번호가있는 테이블을 가지고 있으므로 동일한 itemID와 항목 이름을 가진 중복 항목이 있지만 다른 버전은 가격이 다를 수 있습니다. 나는 항목 가격은 그래서 비교 함수의 일종 필요하지만 SQL에 어디서부터 시작 확실하지 않은 추측 여러 버전이있을 것입니다 항목의 가격이 변경되었는지 확인하려면

itemid | item | price |version | date 
1   a  1.13 1  2011-12-01 
2   b  5.13 1  2011-12-01 
3   c  3.66 1  2011-12-01 
4   a  1.03 2  2012-01-09 
5   b  5.13 2  2012-01-09 
6   c  3.33 2  2012-01-09 

을 변경하는 확인하기 위해 간단한 SQL 문을 원했다.

그래서 위의 예는 이전 버전에서 가격이 변경되었으므로 ac 품목 만 반품하고 싶습니다. 이것은 당신에게 가격은 이전 버전에서 변경된 항목의 목록을 제공

+1

무엇에 비해 변경 되었습니까? 나중의 시점? max_version은 다른 곳에 저장되어 있습니까? – Beth

+0

이전 버전에서 변경된 – Standage

+0

이 이전 버전에서 다른 테이블에 항목별로 변경 되셨습니까? 비교 소스가 필요합니다. – Beth

답변

2

시도 :

SELECT item, COUNT(DISTINCT price) prices 
FROM yourTable 
/* WHERE clause would go here */ 
GROUP BY item 
HAVING COUNT(DISTINCT price) > 1 

선택 사항은 다음과 같습니다

WHERE version in (1,2) 

- 당신은 단지 1, 2

+0

보다 간단하고 효율적인 솔루션이 작동합니다. – Standage

1

는 :

WITH V AS (
    SELECT MAX(version) CurrentFileVersion 
    FROM yourTable 
), C AS (
    SELECT item, price, version 
    FROM yourTable INNER JOIN V ON yourTable.version = V.CurrentFileVersion 
), P AS (
    SELECT item, price, version 
    FROM yourTable INNER JOIN V ON yourTable.version = (V.CurrentFileVersion - 1) 
) 
SELECT C.item 
FROM C INNER JOIN 
    P ON C.item = P.item 
WHERE C.price <> P.price; 

이 심지어 모든 중간 단계를 보여줍니다. 나는 정직하게 이것을 따르기 위해 더 단순하거나 명백하게 만들 수 없다.

+0

그들은 모두 하나 이상의 버전을 가지고 있지만, 가격이 변경된 제품을 원합니다. – Standage

+0

업데이트 된 답변 덕분에 – Standage

0

이 정보로이 테이블의 데이터로 테이블을 업데이트한다고 가정합니다.

필자는 각 레코드의 가장 최신 버전을 임시 테이블이나 CTE로 가져 오지 않을 것입니다. 그런 다음 새로운 레코드를 삽입하거나 가격이 기존 가격과 다른 곳을 업데이트하려면 MERGE 문을 실행합니다.

1

SELECT * FROM Prices T 
where exists (
SELECT 1 from Prices 
    where item = T.item and version = T.version - 1 and price != T.price 
) 

을 시도해보십시오 특정 버전을 비교하려면 추신. 테이블 이름으로 "가격"을 변경하십시오.

관련 문제