Группировка наборов данных в oracle sql

Я пытался разделить группы данных, хранящихся в моей базе данных Oracle, для более точного анализа.

Current Output
Time   Location
10:00  A111
11:00  A112
12:00  S111
13:00  S234
17:00  A234
18:00  S747
19:00  A878

Desired Output
Time   Location  Group Number
10:00  A111      1
11:00  A112      1
12:00  S111      1
13:00  S234      1
17:00  A234      2
18:00  S747      2
19:00  A878      3

Я пытался использовать over и partition by для присвоения значений, однако я могу постоянно увеличивать их, а не только при изменении. Также пытался использовать задержку, но я изо всех сил пытался ее использовать.

Мне нужно только значение во втором столбце, чтобы оно начиналось с 1 и увеличивалось при изменении первой буквы поля 1 (с использованием substr).

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

select event_time, st_location, Row_Number() over(partition by 
SUBSTR(location,1,1) order 
by event_time) 
as groupnumber from pic

Любая помощь могла бы быть полезна!

Редактировать:

Time   Location  Group Number
10:00  A-10112      1
11:00  A-10421      1
12:00  ST-10621     1
13:00  ST-23412     1
17:00  A-19112      2
18:00  ST-74712     2
19:00  A-87812      3

как указать порядок этих строк? есть ли другой столбец с заказом? пожалуйста, добавьте это в свой пример.

Radim Bača 11.04.2018 12:34

Изначально 2 столбца, event_time и location, и я хочу добавить третий. Отредактировал исходный пост.

James Pavett 11.04.2018 12:38

добавить образец данных с другими в столбцы event_time, st_location

Jay Shankar Gupta 11.04.2018 12:40

Думаю, я сделал это сейчас?

James Pavett 11.04.2018 12:45
4
4
159
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

select DENSE_RANK() over(partition by SUBSTR("location",1,1) ORDER BY SUBSTR("location",1,2)) 
as Rownumber, 
"location" from Table1;

Демо

http://sqlfiddle.com/#!4/21120/16

Это отлично работает для первой таблицы. Я только что внес правку, указав второй тип локаций, с которыми мне тоже нужно это сделать. Почему не работает, когда есть - между локациями? Или это потому, что значения изменения (A и S) больше не соответствуют размеру?

James Pavett 11.04.2018 12:54

@JamesPavett решение неверно, поскольку оно не изолирует последовательные последовательности ...

Radim Bača 11.04.2018 13:00
Ответ принят как подходящий

Это проблема разрыва и острова. Используйте следующий код:

select location, 
       dense_rank() over (partition by SUBSTR(location,1,1) order by grp)
from
(
    select (row_number() over (order by time)) - 
           (row_number() over (partition by SUBSTR(location,1,1) order by time)) grp,
           location, 
           time
    from data
) t
order by time

демонстрация dbfiddle

Основная идея заключается в подзапросе, который выделяет последовательные последовательности элементов (вычисление столбца grp). Остальное просто, если у вас есть столбец grp.

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

James Pavett 11.04.2018 12:57

Исправление, просто пытаюсь это сделать сейчас, но я считаю, что это действительно работает независимо от того.

James Pavett 11.04.2018 12:59

@JamesPavett, как я уже сказал, суть проблемы - это классическая проблема с пробелами и островками (у нее даже есть тег в SO). попробуйте поискать другие вопросы с этим тегом, это может помочь вам понять мое решение.

Radim Bača 11.04.2018 13:05

Другие вопросы по теме