Использование функции Row_Number - PullRequest
0 голосов
/ 29 января 2019

Мои данные выглядят так -

clientid    calendar    Num
18161       20170518    1
18161       20170705    0
18161       20170718    0
43431       20150518    0

Первый клиент 0 Num для 18161 находится во втором календаре.Первый клиент 0 Num для 43431 находится в первом календаре (20150518).Я хочу, чтобы SQL генерировал этот вывод -

clientid    FirstZero
18161       2 
43431       1

Это то, что у меня есть, но row_number генерируется для всех calendars.Мне это нужно только в первый раз Num становится равным нулю для конкретного клиента.

SELECT clientid, calendar,
Row_Number() Over (order by clientid) As FirstZero
from DAILY
where num = 0  
and clientid = 18161

Ответы [ 3 ]

0 голосов
/ 29 января 2019
with fz as 
(
SELECT clientid, calendar, num, 
Row_Number() Over (partition by clientId order by calendar) As FirstZero
from DAILY
),
gz as
(
  select clientid, min(FirstZero) as FirstZero 
  from fz
  where num = 0
  group by clientId
)
select d.clientId, d.calendar, gz.firstZero
 from Daily d 
 inner join fz on d.clientId = fz.clientId and d.calendar = fz.calendar
 inner join gz on fz.clientId = gz.clientId and fz.firstZero = gz.firstZero
 --where d.clientId = 18161

Демонстрационная скрипка

0 голосов
/ 29 января 2019

Вы можете использовать CTE для создания ваших row_numbers, а затем найти MIN ()

;WITH cte AS (
SELECT clientID, 
Calendar, 
Num, 
ROW_NUMBER() OVER(PARTITION BY clientid ORDER BY calendar) AS counter_
FROM table
)
SELECT 
clientID, MIN(counter_) AS FirstZero
FROM cte 
WHERE Num=0
GROUP BY clientID
0 голосов
/ 29 января 2019

Вот, пожалуйста,

select
  clientid,
  min(pos) as firstzero
from (
  select
    clientid,
    num,
    row_number() over(partition by clientid order by calendar) as pos
  from daily
) x
where num = 0
group by clientid
...