SQLServer2008을 사용하고 있으며 전에 본 적이없는 문제가 발생했습니다. 몇 가지 값이 각 분기마다 여러 번 복제되는 데이터 집합이 있습니다. 각 분기에 가장 최근 값을 선택하려고합니다.조인 된 테이블의 다른 필드를 기준으로 가장 최근 값을 선택하십시오.
SELECT PPAV.BusinessID
, (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1))) AS Quarter
, PAV.PartnerAttributeValue
FROM Partner_PartnerAttributeValue PPAV
JOIN PartnerAttributeValue PAV
ON PAV.PartnerAttributeValueID = PPAV.PartnerAttributeValueID
WHERE PAV.PartnerAttributeID = 7
AND (PPAV.PartnerAttributeValueID = 22 OR PPAV.PartnerAttributeValueID = 795 OR PPAV.PartnerAttributeValueID = 796)
GROUP BY PPAV.BusinessID
, (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1)))
, PAV.PartnerAttributeValue
이것은 문제가 발생한 코드입니다. 나는 분기당 하나의 가치만을 원합니다. 때로는 분기 중반에 변경 사항이 있으며 정보가 복제됩니다. 이 문제를 해결하려고 시도했을 때이 코드를 사용하고 있었고 문제점 쿼터가 4 개의 값을 갖도록함으로써 실제로 문제를 악화 시켰습니다.
SELECT PPAV.BusinessID
, (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1))) AS Quarter
, CASE WHEN (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1))) = (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1)))
THEN SubHist.PartnerAttributeValue
ELSE PAV.PartnerAttributeValue
END AS PartnerAttributeValue
FROM Partner_PartnerAttributeValue PPAV
JOIN PartnerAttributeValue PAV
ON PAV.PartnerAttributeValueID = PPAV.PartnerAttributeValueID
JOIN (SELECT PPAV.BusinessID
, MAX(PPAV.PartnerAttributeValueStartDate) AS MAX
, PAV.PartnerAttributeValue
FROM Partner_PartnerAttributeValue PPAV
JOIN PartnerAttributeValue PAV
ON PAV.PartnerAttributeValueID = PPAV.PartnerAttributeValueID
WHERE PAV.PartnerAttributeID = 7
AND (PPAV.PartnerAttributeValueID = 22 OR PPAV.PartnerAttributeValueID = 795 OR PPAV.PartnerAttributeValueID = 796)
GROUP BY PAV.PartnerAttributeValue
,PPAV.BusinessID
)SubHist
ON SubHist.BusinessID = PPAV.BusinessID
WHERE PAV.PartnerAttributeID = 7
AND (PPAV.PartnerAttributeValueID = 22 OR PPAV.PartnerAttributeValueID = 795 OR PPAV.PartnerAttributeValueID = 796)
GROUP BY PPAV.BusinessID
, (cast(year(PPAV.PartnerAttributeValueStartDate) as char(4)) + '0' + cast(datepart(qq, PPAV.PartnerAttributeValueStartDate) as char(1)))
, PAV.PartnerAttributeValue
, SubHist.PartnerAttributeValue
나는 문제를 악화시키기 위해 무엇을했는지 매우 확신하지 못한다. 추가 된 조인 된 테이블에서 오는 CASE WHEN 문이 문제를 해결할 것이라고 생각했습니다.
도움을 주시면 대단히 감사하겠습니다. 다음은
내가4356 201501 REGISTERED
4356 201502 REGISTERED
4356 201503 REGISTERED
4356 201504 REGISTERED
4356 201601 GOLD
4356 201601 REGISTERED
4356 201602 REGISTERED
4356 201603 REGISTERED
4356 201604 REGISTERED
2016 년 1 분기 데이터가로 인해 왜곡됩니다, 여러 값을 가지고 어디에 문제를 제거하기 위해 노력하고 일부 샘플 데이터입니다. 골드 값과 GOLD 값만 있어야합니다.
고마워요!
분기당 하나의 값을 원하지만 분기의 값이 둘 이상일 수 있습니다. 예를 들어 SUM과 같은 집계 함수를 사용해야한다고 생각합니다. –
당신이'row_number()와 같은 윈도우 함수를 사용할 수있는 것처럼 보입니다. (PartnerID에 의한 파티션, 분기, Order by PartnerAttributeValueStartDate desc) RN' 서브 클래스 나 cte 안에 랩핑 한 다음'RN = 1 '을 추가하십시오. – xQbert
확실하지 않습니다. 합계가 작동합니다. 이것은 더 큰 쿼리의 작은 하위 집합입니다. 값은 문자 값이므로 분기가 같은 최대 날짜의 문자 값이 필요합니다. 이 쿼리는 ROW_number 트릭을 사용하는 더 큰 CTE의 일부일뿐입니다. 더 큰 함수의 성능은 이미 매우 좋지 않습니다. ( – Gollathor