0

我有一个看起来像这样的表:

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

我需要删除最后一行,因为它循环到第二行。似乎无法弄清楚如何做到这一点。

编辑

有一个索引日期字段。这是桑基图。示例表中的数据实际上是查询的结果。基础表具有:

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 

在示例中,最后一行 C 到 B 是倒退的,我需要忽略它,否则 Sankey 不会显示。我只需要显示前进路径。

4

3 回答 3

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 子句来生成图表的输入。

于 2013-08-20T15:18:11.850 回答
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 小提琴演示

于 2013-08-20T15:23:46.370 回答
0
DELETE FROM yourTable
where [Column A]='C'

鉴于这些都是你的行

编辑

如果可以的话,我建议您清理源数据,即删除您向后调用的行,如果这些行不正确,如您在评论中所述。

于 2013-08-20T13:52:45.087 回答