2016-12-19 11 views
1

У меня есть база данных, структурированная для пользовательских кликов. Каждый раз, когда кто-то нажимает на веб-сайт для посещения другого веб-сайта, я фиксирую имя пользователя, веб-сайт и то, что клик по клику. Это выглядит так:Как преобразовать таблицу в пары узлов с помощью SQL

+----------+-------+---------------+ 
| Customer | Click | Website  | 
+----------+-------+---------------+ 
| john  | 1  | facebook  | 
+----------+-------+---------------+ 
| john  | 2  | microsoft  | 
+----------+-------+---------------+ 
| john  | 3  | facebook  | 
+----------+-------+---------------+ 
| steven | 1  | apple   | 
+----------+-------+---------------+ 
| steven | 2  | stackoverflow | 
+----------+-------+---------------+ 
| steven | 3  | cnn   | 
+----------+-------+---------------+ 

Я хочу визуализировать, как люди перемещаются по Интернету. Я считаю, что путь узла - лучшая идея, но я не уверен, как преобразовать эти данные в это. Для пар значений узла, таблица выше, должны быть манипулировать, чтобы выглядеть следующим образом:

+----------+----------------+-----------------+ 
| Customer | Origin Website | Landing Website | 
+----------+----------------+-----------------+ 
| john  | facebook  | microsoft  | 
+----------+----------------+-----------------+ 
| john  | microsoft  | facebook  | 
+----------+----------------+-----------------+ 
| steven | apple   | stackoverflow | 
+----------+----------------+-----------------+ 
| steven | stackoverflow | cnn    | 
+----------+----------------+-----------------+ 

ли это возможно сделать только с помощью Oracle SQL?

ответ

2

Что-то вроде этого. Я добавил столбец, чтобы показать последовательность «прыжков» с одного веб-сайта на другой; иначе вы узнаете, откуда и где, но не в каком порядке.

with 
    test_data (Customer, Click, Website) as (
     select 'john' , 1, 'facebook'  from dual union all 
     select 'john' , 2, 'microsoft'  from dual union all 
     select 'john' , 3, 'facebook'  from dual union all 
     select 'steven', 1, 'apple'   from dual union all 
     select 'steven', 2, 'stackoverflow' from dual union all 
     select 'steven', 3, 'cnn'   from dual 
    ) 
-- end of test data; the SQL query begins below this line 
select * 
from (
     select customer, 
       row_number() over (partition by customer order by click) as ord, 
       website as origin_website, 
       lead(website) over (partition by customer order by click) as landing_website 
     from test_data 
    ) 
where landing_website is not null 
order by customer, ord 
; 

CUSTOMER  ORD ORIGIN_WEBSITE LANDING_WEBSITE 
--------- ------- -------------- --------------- 
john   1 facebook  microsoft 
john   2 microsoft  facebook 
steven   1 apple   stackoverflow 
steven   2 stackoverflow cnn 

4 rows selected. 
+0

hah, я использовал идею Siyuals, чтобы попытаться написать ваше решение, вернулся сюда и увидел ваше сообщение. Благодаря! Это сложная проблема :) – barker

3

Вы можете сделать это с помощью LEAD():

Select Customer, 
     Website As "Origin Website", 
     Lead(Website) Over (Partition By Customer Order By Click) As "Landing Website" 
From YourTable 
+0

Thanks Siyual! Я все еще изучаю оконные функции :) – barker

 Смежные вопросы

  • Нет связанных вопросов^_^