ROW_Number с пользовательской группой - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь создать row_number на основе пользовательской группировки, но не могу ее создать.

Ниже приведен мой запрос

CREATE TABLE mytbl (wid INT, id INT)
INSERT INTO mytbl Values(1,1),(2,1),(3,0),(4,2),(5,3)

ТекущийВыходные данные

wid     id
1        1
2        1
3        0
4        2
5        3

Запрос

SELECT *, RANK() OVER(PARTITION BY wid, CASE WHEN id = 0 THEN 0 ELSE 1 END ORDER BY ID)
FROM mytbl

Я хотел бы ранжировать строки в соответствии с пользовательским условием, например, если ID равен 0, тогда у меня есть новая группа, пока я не начнуимеют не 0 ID.

Ожидаемый результат

wid     id  RN
1        1  1
2        1  1
3        0  1
4        2  2
5        3  2

Ответы [ 4 ]

3 голосов
/ 23 октября 2019

Гадание здесь, поскольку у нас нет особых разъяснений, но, возможно, это:

SELECT wid,
       id,
       COUNT(CASE id WHEN 0 THEN 1 END) OVER (ORDER BY wid ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) +1 AS [Rank]
FROM mytbl ;
1 голос
/ 23 октября 2019

Попробуйте,

CREATE TABLE #mytbl (wid INT, id INT)
INSERT INTO #mytbl Values(1,1),(2,1),(3,0)
,(4,2),(5,3),(6,0),(7,4),(8,5),(9,6)

;with CTE as
(
select *,ROW_NUMBER()over(order by wid)rn 
from #mytbl where id=0

)
,CTE1 as
(
select max(rn)+1 ExtraRN from CTE
)
select a.* ,isnull(ca.rn,ca1.ExtraRN) from #mytbl a
outer apply(select top 1 * from CTE b 
where a.wid<=b.wid )ca
cross apply(select ExtraRN from CTE1)ca1


drop table #mytbl

Здесь и OUTER APPLY, и CROSS APPLY не увеличат cardianility оценку. Она всегда будет возвращать только одну строку.

1 голос
/ 23 октября 2019

без особых разъяснений по требуемой логике, насколько я понимаю, вы хотите увеличить Rank на 1 всякий раз, когда id = 0

select  wid, id, 
        [Rank]  = sum(case when id = 0 then 1 else 0 end) over(order by wid) 
                + case when id <> 0 then 1 else 0 end
from    mytbl
1 голос
/ 23 октября 2019

Если я вас правильно понимаю, вы можете использовать следующий подход. Обратите внимание, что вам нужно иметь столбец заказа (я предполагаю, что это столбец wid):

Заявление:

;WITH ChangesCTE AS (
    SELECT 
        *,
        CASE WHEN LAG(id) OVER (ORDER BY wid) = 0 THEN 1 ELSE 0 END AS ChangeIndex
    FROM mytbl
), GroupsCTE AS (
    SELECT 
        *,
        SUM(ChangeIndex) OVER (ORDER BY wid) AS GroupIndex
    FROM ChangesCTE
)
SELECT 
    wid,
    id,
    DENSE_RANK() OVER (ORDER BY GroupIndex) AS Rank
FROM GroupsCTE

Результат:

wid id  Rank
1   1   1
2   1   1
3   0   1
4   2   2
5   3   2
...