SQL Server Группировка по последовательным значениям - PullRequest
0 голосов
/ 19 июня 2019

У меня есть таблица SQL Server 2014, которая содержит служебные записи для данного поставщика.Мне нужно сгруппировать по Supplier_ID и последовательным значениям ServiceDay и вывести min (CostingService_ID).

Данные и схема в качестве примера SQL Fiddle

Вот пример необработанных данных SQL

CostingService_ID   Supplier_ID ServiceDay
722250  6191    1
722251  6759    2
722252  6363    3
722253  6903    4
722254  6301    5
722255  6301    6
722256  7667    7
722257  7195    8
722258  6191    10
722259  6191    11
722260  6191    12
722261  6191    13
722262  7195    9

Так что в этом случае я хотел бы вывести

722250  
722251  
722252  
722253  
722254  
722256  
722257  
722258  

Обычный групповой режим в этом случае не работает.

Ответы [ 6 ]

2 голосов
/ 19 июня 2019

Если я правильно понимаю, вам нужно это:

  select CostingService_ID from (   
     select CostingService_ID ,  row_number() over(partition by Supplier_ID order by ServiceDay) rn from t
  ) t
  where rn = 1
  order by CostingService_ID
1 голос
/ 19 июня 2019

Попробуйте запрос ниже:

SELECT MIN(CostingService_ID) FROM (
  SELECT CostingService_ID,
         ROW_NUMBER() OVER (ORDER BY ServiceDay) -
         ROW_NUMBER() OVER (PARTITION BY Supplier_ID ORDER BY ServiceDay) grp
  FROM CostingService
) a GROUP BY grp

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

1 голос
/ 19 июня 2019

Этот следующий скрипт должен дать вам MIN CostingService_ID на каждый Supplier_ID

SELECT MIN(CostingService_ID)
FROM your_table
GROUP BY Supplier_ID
0 голосов
/ 19 июня 2019

Проверьте этот подход, я тестировал добавление непоследовательных дней для одного и того же получателя, и это работает ..

;with consecutives as (
    select Supplier_ID , ServiceDay
    from @t t1
    where not exists (select 1 from @t where Supplier_ID  = t1.Supplier_ID  and ServiceDay = t1.ServiceDay -1)
)
select t1.Supplier_ID , t1.ServiceDay, t2.ServiceDay as nextServiceDay, CostingService_ID
from consecutives t1
outer apply (
    select top 1 n.ServiceDay from consecutives n where n.Supplier_ID  = t1.Supplier_ID  and n.ServiceDay > t1.ServiceDay order by n.ServiceDay
) t2
outer apply (
    select min(CostingService_ID) CostingService_ID from @t where Supplier_ID  = t1.Supplier_ID  and ServiceDay between t1.ServiceDay and isnull(t2.ServiceDay - 1, t1.ServiceDay)
) t3
0 голосов
/ 19 июня 2019

Если я вас правильно понимаю, вам нужно что-то вроде

select *
from CostingService cs
where not exists(
    select * from CostingService
    where Supplier_ID = cs.Supplier_ID and ServiceDay = cs.ServiceDay - 1
)
0 голосов
/ 19 июня 2019

Используйте функцию row_number ()

SELECT CostingService_ID
FROM (SELECT CostingService_ID, ROW_NUMBER() OVER (PARTITION BY Supplier_ID ORBER BY CostingService_ID) AS rownum FROM CostingService) AS a
where rownum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...