2013-08-20 3 views
0

У меня есть таблица, которая выглядит следующим образом:SQL запрос, чтобы удалить избыточность циклического

Column A | Column B |  Counter 
--------------------------------------------- 
     A  |  B   |  53 
     B  |  C   |  23 
     A  |  D   |  11 
     C  |  B   |  22 

Мне нужно удалить последнюю строку, потому что это циклический ко второму ряду. Кажется, не получается выяснить, как это сделать.

EDIT

Существует индексированный поле даты. Это для диаграммы Санки. Данные в таблице примеров фактически являются результатом запроса. Базовая таблица имеет:

date | source node | target node | path count 

запрос для создания таблицы является:

SELECT source_node, target_node, COUNT(1) 
FROM sankey_table 
WHERE TO_CHAR(data_date, 'yyyy-mm-dd')='2013-08-19' 
GROUP BY source_node, target_node 

В образце, последняя строка С до B идет в обратном направлении, и мне нужно игнорировать его или Сэнки выиграл Показывать. Мне нужно показать только путь вперед.

+0

Откуда вы знаете, какую строку удалить, почему бы не удалить вторую строку? если вы не включили «порядок», в базе данных нет реальной концепции «последней строки» (хорошо, если таблица проиндексирована, она, скорее всего, всегда вернет строки по порядку индекса, но я бы не решался полагаться на это, не делая «порядок по» в столбцах индекса) –

+0

Строки упорядочиваются соответственно. Я могу игнорировать второй экземпляр. – raylee

+0

Упорядочено соответствующим образом?Вы не можете положиться на заказ, который они добавили. –

ответ

0

Если вы можете настроить, как заполняется ваша таблица, вы можете изменить запрос, который вы используете, чтобы сначала получить значения для первого направления (для этой даты) с немного аналитической манипуляцией:

SELECT source_node, target_node, counter FROM (
    SELECT source_node, 
    target_node, 
    COUNT(*) OVER (PARTITION BY source_node, target_node) AS counter, 
    RANK() OVER (PARTITION BY GREATEST(source_node, target_node), 
     LEAST(source_node, target_node), TRUNC(data_date) 
     ORDER BY data_date) AS rnk 
    FROM sankey_table 
    WHERE TO_CHAR(data_date, 'yyyy-mm-dd')='2013-08-19' 
) 
WHERE rnk = 1; 

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

Это может быть кандидат на материализованное представление, если вы ежедневно обрезаете и переполняете его.

Если вы не можете изменить свою промежуточную таблицу, но все равно можете увидеть базовую таблицу, к которой вы могли бы присоединиться, используя ту же идею; если предположить, что таблица, которую вы запрашиваете из называется sankey_agg_table:

SELECT sat.source_node, sat.target_node, sat.counter 
FROM sankey_agg_table sat 
JOIN (SELECT source_node, target_node, 
    RANK() OVER (PARTITION BY GREATEST(source_node, target_node), 
     LEAST(source_node, target_node), TRUNC(data_date) 
     ORDER BY data_date) AS rnk 
    FROM sankey_table) st 
ON st.source_node = sat.source_node 
AND st.target_node = sat.target_node 
AND st.rnk = 1; 

SQL Fiddle demos.

0
DELETE FROM yourTable 
where [Column A]='C' 

, учитывая, что все эти ваши строки

EDIT

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

+0

Должно быть, рано! Я полностью не думал об удалении строк, потому что мне они действительно не нужны, но это не будет делать то, что мне нужно. – raylee

+0

, то вы должны уточнить, что вам нужно – Hedinn

1

Удаление всех ребер из вашего графа, где кортеж (source_node, target_node) не упорядоченные по алфавиту и симметричная строка существует должна дать вам то, что вы хотите:

DELETE 
FROM sankey_table t1 
WHERE source_node > target_node 
AND EXISTS (
    SELECT NULL from sankey_table t2 
    WHERE t2.source_node = t1.target_node 
    AND t2.target_node = t1.source_node) 

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

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