sql - link - html title tag




줄무늬 증가 열 (2)

이것은 변방 섬의 변종입니다.

행 번호의 차이를 사용하여 줄무늬를 정의하고 싶습니다. 이것은

select c.*,
       (case when veganoption = 1
             then row_number() over (partition by veganoption, seqnum - seqnum_v order by uniqueid)
             else 0
        end) as veganstreak
from (select c.*,
             row_number() over (partition by veganoption order by uniqueid) as seqnum_v,
             row_number() over (order by uniqueid) as seqnum
      from c
     ) c;

왜이 작품은 설명하기가 약간 어렵습니다. 그러나 하위 쿼리의 결과를 살펴보면 행 번호의 차이로 식별 할 줄무늬를 정의하는 방법을 알 수 있습니다. 나머지는 row_number() 를 적용하여 식사를 나열하는 것입니다.

여기 Rextester 있습니다.

다음 결과를 노란색으로 강조 표시하려면 어떻게합니까?

기본적으로 VeganOption = 1 일 때 1 씩 증가하고 VeganOption = 0 일 때 0 인 계산 된 필드가 필요합니다.

다음 쿼리를 사용해 보았지만 파티션을 사용하면 0 이후에 계속 증가합니다. 나는 이것에 조금 붙어있다.

SELECT [UniqueId]
      ,[Meal]
      ,[VDate]
      ,[VeganOption]
      , row_number() over (partition by [VeganOption] order by [UniqueId])
  FROM [Control]
  order by [UniqueId]

표 데이터 :

CREATE TABLE Control
    ([UniqueId] int, [Meal] varchar(10), [VDate] datetime, [VeganOption] int);

INSERT INTO Control ([UniqueId], [Meal], [VDate], [VeganOption])
VALUES
('1', 'Breakfast',' 2018-08-01 00:00:00', 1),
('2', 'Lunch',' 2018-08-01 00:00:00', 1),
('3', 'Dinner',' 2018-08-01 00:00:00', 1),
('4', 'Breakfast',' 2018-08-02 00:00:00', 1),
('5', 'Lunch',' 2018-08-02 00:00:00', 0),
('6', 'Dinner',' 2018-08-02 00:00:00', 0),
('7', 'Breakfast',' 2018-08-03 00:00:00', 1),
('8', 'Lunch',' 2018-08-03 00:00:00', 1),
('9', 'Dinner',' 2018-08-03 00:00:00', 1),
('10', 'Breakfast',' 2018-08-04 00:00:00', 0),
('11', 'Lunch',' 2018-08-04 00:00:00', 1),
('12', 'Dinner',' 2018-08-04 00:00:00', 1)
;

이것은 SQL Server 2016+ 용입니다.


한 가지 방법은 CTE를 사용하여 그룹을 정의한 다음 그 그룹에서 추가로 ROW_NUMBER() 를 수행하여 다음과 같은 결과를 얻는 것입니다.

WITH Grps AS(
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY UniqueID ASC) - 
           ROW_NUMBER() OVER (PARTITION BY VeganOption ORDER BY UniqueID ASC) AS Grp
    FROM Control)
SELECT *,
       CASE VeganOption WHEN 0 THEN 0 ELSE ROW_NUMBER() OVER (PARTITION BY Grp ORDER BY UniqueID ASC) END
FROM Grps
ORDER BY UniqueId;






gaps-and-islands