2013-10-25 4 views
1

모두. 다음 쿼리를 수행 할 수 없습니다. 도와주세요. 논리 초기 데이터와 OUPUT 다음 엑셀 여기 initial data/output google/drive속성에 따라 데이터 검색

있습니다 인 '나머지'= 2500, 그것은 하나를 증가시키고 출력 날짜 1 컬럼에 넣어, '날짜'의 최소값을 얻어; Date2는 'Rest'값 (1181,85)의 날짜의 최소값을받습니다. 등등 : Date1은 'Date'(14.01.2013)의 'Rest'(1181,85) min 값을 1 씩 15.01.2013) 등등. 'Rest'값이 0 인 경우 위의 작업을 수행하면 안됩니다 (건너 뜁니다). 앞에서 설명한 것처럼 'Rest'값이 0 인 행을 처음에는 Date2에 사용하므로 행을 삭제할 수 없습니다. 많은 'accNumber'가 있습니다. 모두 나열해야합니다. 도와주세요. 자세한 내용을 묻지 않는다면 이해해 주시기 바랍니다. 미리 감사드립니다. SQL 서버를 사용하고 있습니다.

+0

1. 당신은 샘플 데이터의 작은 비트를 게시 더 잘하고 (임의 문서를 다운로드하는 사람을 기대하지 않습니다 예) SO에 출력을 직접 예상 2 당신이 한 어떤 시도라도 보는 것이 좋을 것입니다. –

+0

그것은 내가 10보다 작은 reoutation을 가지고 있기 때문에 데이터를 보여줄 수있는 유일한 방법은 Google 드라이브입니다. –

+0

표 1 a, 표 1 b 에서 a.accNumber, a.Rest, min (a.Date), min (b.Date)을 선택하십시오. b.Date> a.Date 및 a.accNumber = b.accNumber 및 a .Rest <> b.Rest Group by a.accNumber, a.Rest a.accNumber, 3 –

답변

0

내가 올바르게 이해했다면, 나머지 숫자로 항목을 그룹화 한 다음 최소 날짜 + 1 일 및 "다음"나머지 숫자의 최소 날짜를 표시하려고합니다. 두 개의 다른 장소에서 Rest 번호가 0 일 때 어떻게 될 것으로 예상됩니까?

with Base as 
(
    select t.AccNum, 
       t.Rest, 
       DATEADD(day, 1, MIN(t.Date)) as [StartDate], 
       ROW_NUMBER() OVER (ORDER BY MIN(t.Date)) as RowNumber 
    from  Accounts t 
    where  t.Rest <> 0 
    group by t.AccNum, t.Rest 
) 
select  a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate] 
from  Base a 
left join Base b 
on   a.RowNumber = b.RowNumber - 1 
order by a.[StartDate] 

가 나머지 번호가 더 아래 중복 될 가능성이지만, 별도의 항목이 될 필요가 있음을, 우리는 우리의 초기 선택 쿼리에서 조금 더 영리해야합니다. 두 쿼리에 대한

with Base as 
(
    select b.AccNum, b.Rest, MIN(DATEADD(day, 1, b.Date)) as [StartDate], ROW_NUMBER() OVER (ORDER BY MIN(Date)) as [RowNumber] 
    from (
     select *, ROW_NUMBER() OVER (PARTITION BY Rest ORDER BY Date) - ROW_NUMBER() OVER (ORDER BY Date) as [Order] 
     from Accounts a 
    -- where a.Rest <> 0 
    -- If we're still filtering out Rest 0 uncomment the above line 
    ) b 
    group by [order], AccNum, Rest 
) 
select  a.RowNumber, a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate] 
from  Base a 
left join Base b 
on   a.RowNumber = b.RowNumber - 1 
order by a.[StartDate] 

결과 :

Account Number   REST Start Date End Date 
45817840200000057948 2500 2013-01-01 2013-01-14 
45817840200000057948 1181 2013-01-15 2013-01-31 
45817840200000057948 2431 2013-02-01 2013-02-09 
45817840200000057948 1563 2013-02-10 NULL 
+0

0으로 행을 건너 뛰면됩니다. 어디에서나 '나머지'값은 –

+0

입니다. 편집 된 대답을 확인하고 나머지 번호를 더 자세히 반복 할 수는 있지만 별도의 트랜잭션으로 간주해야합니다. –

+0

https://drive.google.com/file/d/0BwcVwVHkHN8Sd0VkUWdaal8wNGs/edit?usp=sharing 뭔가 다른 결과를 제공합니다. 나는 당신이 그 논리를 이해하고 있다고 생각합니다. 대답 해 주실 수 있겠습니까? 나는 3 일 동안 그것을 할 올바른 방법을 생각해 낼 수 없다. ((많이 고마워.) –

관련 문제