2016-08-29 2 views
0

다음과 같이 SQL Server 2014에 예제 데이터가있는 테이블이 있습니다. SQL의 연속 값을 기준으로 그룹화하는 방법

WK_NUM | NET_SPRD_LCL 
10  0 
11  1500 
12  3600 
13  3800 
14  4000 

은 내가 WK_NUM에 그룹에 필요한 직장에서 보너스 구조를 코딩하는 것을 시도하고있다. 그래서 NET_SPRD_LCL> 3500을 두 개의 연속 WK_NUMs로 표시하면 WHERE WK_NUM < 27이됩니다.이 예에서 WK_NUM 12와 13에 대한 NET_SPRD_LCL은 둘 다 3500보다 크므로 SQL은 2000을 출력하고 종료해야합니다. 따라서 WK_NUM 13과 14가 NET_SPRD_LCL> 3500이라는 조건을 만족한다는 사실을 무시해야합니다.

이 문제에 도움을 주셔서 감사합니다.

+0

@CharlesBretana는 주 번호 일 수 있습니다. –

+0

"연속"이라는 말은 1,2,3,4 등과 같이 순서대로 다음을 의미합니다. 그렇다면 두 작업 번호가 어떻게 동일하면 연속적으로 작동합니까? (하나 이상의 레코드에서 동일한 값을 가져야하는 그룹으로 묶기 위해) 당신은 분명히 직장 번호가 아닌 다른 것을 기반으로하는 연속을 의미합니다. 연속을 정의하는 것은 무엇입니까? 어떤 타임 스탬프? 삽입 된 각 레코드에 대해 숫자 키가 하나씩 증가합니까? 뭐? –

+0

2000 년은 어디에서 왔습니까? 테이블에있는 데이터와 관련이없는 것 같습니까? 그래서이 경우 실제로 어떤 쌍이 식별되는지는 중요하지 않습니다. –

답변

1

첫째, 당신이 '출력'과 '출구'에 쿼리를 원하는 말할 때, 그것은 내가 당신이 절차 적으로 T-SQL에 접근하고 생각하게 언어는 그렇지 않습니다. 좋은 t-sql 쿼리는 거의 항상 기반으로 설정됩니다. 당신은 당신이 관련 의미 SQL 서버 2014을 사용하는 말을

DECLARE @t TABLE (WK_NUM INT, NET_SPRD_LCL INT); 
INSERT INTO @t VALUES 
(10, 0), 
(11, 1500), 
(12, 3600), 
(13, 3800), 
(14, 4000); 

:

어떤 경우

쿼리하기 전에, 내가 다른 사람이 쿼리를 작성하기 위해 데이터 작업을 위해 도움이 될 것입니다 무엇을 추가 할 수 있습니다 창 기능을 자유롭게 사용할 수 있습니다. 내가 사용하는 (LAG) 하위 쿼리를 사용하여 우수한 성능을 가질 것입니다. 사용을 고집한다면 전체적으로 MIN 함수를 사용하는 대신 ORDER BY와 함께 적절한 인덱스 (TOP)를 사용하여 크게 향상시킬 수 있습니다 데이터 세트. 소량의 데이터로는 차이점을 알 수 없지만 실제 비즈니스 시스템에서는 분명합니다. 영업 이익의 설명 후 올바른 줄에 2,000 보너스를 제공하기 위해 조정

:

WITH cteTemp AS 
    (
    SELECT WK_NUM 
     , thisValue = NET_SPRD_LCL 
     , lastValue = LAG(NET_SPRD_LCL) OVER(ORDER BY WK_NUM) 
    FROM @t 
    WHERE WK_NUM < 27 
    ) 
, cteBonusWeek AS 
    (
    SELECT TOP (1) 
      WK_NUM 
     , bonus = 2000 
    FROM cteTemp 
    WHERE thisValue > 3500 AND lastValue > 3500 
    ORDER BY WK_NUM 
    ) 
SELECT t.WK_NUM 
    , t.NET_SPRD_LCL 
    , bonus = COALESCE(b.bonus, 0) 
FROM @t AS t 
LEFT JOIN cteBonusWeek AS b 
    ON b.WK_NUM = t.WK_NUM; 
+0

응답 해 주셔서 감사합니다. 내일 직장에서 당신의 솔루션을 시도 할 것입니다. 출력물에 대해서는 NET_SPRD_LCL> 3500 일 때 2 주째의 레코드를 찾고 있습니다. 따라서 WK_NUM = 13, NET_SPRD_LCL = 3800 및 Bonus = 2000이 출력에 포함되어야합니다. – Raj

+0

은 찾고있는 것을 반영하도록 업데이트되었습니다. – btberry

+0

I 이 데이터 세트를 다른 테이블에 조인해야하므로 EMP_ID를 포함하도록 스크립트를 업데이트했습니다. 그러나 올바른 출력을 얻는 중입니다. – Raj

2

뜻 가정 연속 다음 등 라인 1, 2, 3, 4, 5 ... 등을하지 1, 3, 5, 8, 12,

, 당신이 필요하지 않은 경우 그것이 연속 기록하는 쌍 알고 :

Select case when exists 
    (Select * from table f 
     join table n 
      on n.Wk_Num = f.Wk_Num + 1 
      and n.NET_SPRD_LCL > 3500 
      and f.NET_SPRD_LCL > 3500 
      and n.Wk_Num < 27 
    then 2000 else null end 

당신이 기록의 쌍을 식별해야하는 경우, 다음 : 단순히 증가 연속 경우 반면에

Select f.wk_Num firstWorkNbr, f.NET_SPRD_LCL firstNetSpread, 
     n.wk_Num nextWorkNbr, n.NET_SPRD_LCL nextNetSpread 
from table f 
    join table n 
     on n.Wk_Num = f.Wk_Num + 1 
     and n.NET_SPRD_LCL > 3500 
     and f.NET_SPRD_LCL > 3500 
      and n.Wk_Num < 27 
Where not exists 
    (Select * from table f0 
     join table n0 
      on n0.Wk_Num = f0.wk_Num + 1 
       and n0.WkNum < f.Wk_Num)) 

를, 다음입니다 조금만 der. 당신은 ... 다음 연속 기록을 결정하기 위해 하위 쿼리를 사용하는

Select case when exists 
    (Select * from table f 
     join table n 
      on n.Wk_Num = (Select Min(Wk_Num) from table 
         Where Wk_Num > f.Wk_Num) 
      and n.NET_SPRD_LCL > 3500 
      and f.NET_SPRD_LCL > 3500 
      and n.Wk_Num < 27 
    then 2000 else null end 

을 필요로하고 끝에 2000 (자격 레코드의 특정 첫 번째 쌍에 대한 데이터를 가져 오기 위해 필요한 경우 불필요한 경우 이후가 어떤 자격 쌍 아무것도 반환되지 않습니다됩니다.) 모든

Select f.wk_Num firstWorkNbr, f.NET_SPRD_LCL firstNetSpread, 
     n.wk_Num nextWorkNbr, n.NET_SPRD_LCL nextNetSpread, 2000 outValue 
from table f 
    join table n 
     on n.Wk_Num = (Select Min(Wk_Num) from table 
         Where Wk_Num > f.Wk_Num) 
     and n.NET_SPRD_LCL > 3500 
     and f.NET_SPRD_LCL > 3500 
      and n.Wk_Num < 27 
Where not exists 
    (Select * from table f0 
     join table n0 
      on n0.Wk_Num = (Select Min(Wk_Num) from table 
          Where Wk_Num > f0.Wk_Num) 
       and n0.WkNum < f.Wk_Num)) 
+0

응답 해 주셔서 감사합니다. 하위 쿼리를 사용하여 다음 연속 레코드를 확인하는 세 번째 솔루션을 찾고 있습니다. '2000'을 포함하여 "테이블"의 모든 것을 출력하도록 쿼리를 수정하려고합니다. 나는 SQL을 작동시킬 수 없다. 당신이 제공 할 수있는 도움을 주시면 감사하겠습니다. 감사. – Raj

관련 문제