Как подсчитать строки, чтобы последовательные вхождения данных были равны 1? - PullRequest
0 голосов
/ 07 ноября 2019

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

Ввод:

|item    |statusid|
|--------|--------|
| pencil | A      |
| pencil | B      |
| pencil | C      |
| pencil | A      |-Counts
| pencil | A      |-as one
| pencil | B      |
| pencil | A      |
| eraser | D      |-Counts
| eraser | D      |-as one
| eraser | E      |
| eraser | F      |
| eraser | D      |
| eraser | E      |
| eraser | F      |

Как мне сделать это в SQL Server, используя хранимую процедуру для вывода чего-то вроде этого:

Вывод:

|item    |statusid|occurence|
|--------|--------|---------|
| pencil | A      |  3      |
| pencil | B      |  2      |
| pencil | C      |  1      |
| eraser | D      |  2      |
| eraser | E      |  2      |
| eraser | F      |  2      |

Редактировать: в таблице предполагается, что существует столбец datetime, который может бытьиспользуется для упорядочивания строк.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

С lag() оконной функцией:

select [item], [statusid], count(*) occurence 
from (
  select *, 
    lag([item]) over (order by (select null)) previtem,
    lag([statusid]) over (order by (select null)) prevstatusid
  from tablename
) t
where [item] <> previtem or [statusid] <> prevstatusid or (previtem is null and prevstatusid is null)
group by [item], [statusid] 

См. Демоверсию . Результаты:

> item   | statusid | occurence
> :----- | :------- | --------:
> pencil | A        |         3
> pencil | B        |         2
> pencil | C        |         1
> eraser | D        |         2
> eraser | E        |         2
> eraser | F        |         2

Примечание : проверьте ссылку в одном из комментариев @SeanLange. Этот код будет работать для размещенных вами примеров данных и для сравнительно небольшой таблицы, но не для очень большой таблицы. В любом случае вам понадобится столбец, который определяет порядок строк.

0 голосов
/ 07 ноября 2019
with cte as
 (
   select item, statusid,
      -- tag consecutive rows with the same status
      case when lag(statusid) 
                over (partition by item
                      order by whatever) = statusid -- same status
           then 0 -- remove or
           else 1 -- keep in next step
      end as flag
   from mytable
 )
select item, statusid, count(*)
from cte
where flag = 1 -- now remove those rows
group by item, statusid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...