>

시작 날짜와 종료 날짜에 연결된 많은 키가있는 대규모 직원 데이터 세트가 있습니다. 시작 날짜와 종료 날짜 사이에 겹치지 않고 고유 항목 집합으로 그룹화하고 싶습니다. 예를 들어 다음과 같이 출력을 원합니다.

EmpID   Name    Status  Team    Start   End
1   Zoe Employed    Team01  2018-01-01  2018-01-04
1   Zoe CareerBreak Team01  2018-01-05  2018-01-07
1   Zoe Employed    Team01  2018-01-08  2018-01-10
2   Bob Employed    Team01  2018-01-01  2018-01-03
2   Bob Employed    Team02  2018-01-04  2018-01-10

다음 형식 중 하나로 데이터를 쉽게 얻을 수 있습니다.

EmpID   Name    Status  Start   End
1   Zoe Employed    2018-01-01  2018-01-04
1   Zoe CareerBreak 2018-01-05  2018-01-07
1   Zoe Employed    2018-01-08  2018-01-10
1   Zoe Team01  2018-01-01  2018-01-10
2   Bob Employed    2018-01-01  2018-01-10
2   Bob Team01  2018-01-01  2018-01-03
2   Bob Team02  2018-01-04  2018-01-10

또는

EmpID   Name    Status  Team    Date
1   Zoe Employed    Team01  2018-01-01
1   Zoe Employed    Team01  2018-01-02
1   Zoe Employed    Team01  2018-01-03
1   Zoe Employed    Team01  2018-01-04
1   Zoe CareerBreak Team01  2018-01-05
1   Zoe CareerBreak Team01  2018-01-06
1   Zoe CareerBreak Team01  2018-01-07
1   Zoe Employed    Team01  2018-01-08
1   Zoe Employed    Team01  2018-01-09
1   Zoe Employed    Team01  2018-01-10
2   Bob Employed    Team01  2018-01-01
2   Bob Employed    Team01  2018-01-02
2   Bob Employed    Team01  2018-01-03
2   Bob Employed    Team02  2018-01-04
2   Bob Employed    Team02  2018-01-05
2   Bob Employed    Team02  2018-01-06
2   Bob Employed    Team02  2018-01-07
2   Bob Employed    Team02  2018-01-08
2   Bob Employed    Team02  2018-01-09
2   Bob Employed    Team02  2018-01-10

각 날짜 레코드를 반복하고 비교하여 할 수있었습니다. 그러나 이것은 분명히 너무 오래 걸립니다.

그룹화로 인해 발생하는 문제는 변경 전후의 세부 사항이 동일한 것입니다. 따라서 그룹화에서 날짜를 제외하여 최소 및 최대 날짜를 사용하면 다음을 얻을 수 있습니다.

EmpID   Name    Status  Team    Start   End
1   Zoe Employed    Team01  2018-01-01  2018-01-10
1   Zoe CareerBreak Team01  2018-01-05  2018-01-07

3 개의 항목이어야합니다. 나는 이것을하는 다른 방법을 생각할 수 없다. 그룹화는 이것에 대한 옵션이 아니지만 시작점이 될 수 있다고 확신한다. 나는 연구를 스스로하는 것보다 더 행복하지만, 붙어 있고 무엇을 볼지에 대한 힌트가 필요합니다. (물론 이것은 매우 간단한 데이터 블록이지만 문제를 설명하기에 충분할 것입니다)


  • 답변 # 1

    이것은 그룹과 섬 문제입니다. 날짜에서 일련의 숫자를 빼서 해결할 수 있습니다. 이는 연속 날짜에 대해 일정합니다. 긴 형식의 데이터를 사용합니다 :

    select empid, name, status, team, min(date), max(date)
    from (select t.*,
                 row_number() over (partition by empid, status, team order by date) as seqnum
          from t
         ) t
    group by empid, name, status, team, dateadd(day, -seqnum, date)
    order by empid, min(date);
    
    

  • 이전 javascript - fabricjs - 그룹 크기를 조정할 때 객체 위치를 고정 상태로 유지
  • 다음 javascript - 쉼표 만 마지막 문자가되도록하는 방법