我怎么说'只有打印,如果自上一个打印行以来值已更改'

时间:2012-03-07 01:40:24

标签: sql group-by pivot-table

实际上这些字段不是'1',它们是很长的字符串。我的目标是让c ++程序将这些数据解析为分层对象。所以我希望查询尽可能快地运行,同时返回最小数量的数据,以便我能够用来填充对象。

以下是在我的想象中,如何实现这一目标,但如果有一种更简单的方法来实现真正的目标,那我就是全部的耳朵。

我想到的其他事情: 我考虑了一个数据透视表,但是如果层次结构的每个层都有5个分支,那么当我们到达数据时,我们的数据透视表中会有3000多列。

我希望将2个字段连在一起,然后将它们列入其中 按分层标题字段分组,如果不是,则仅打印字段 与先前打印的行相同。

input
tier1,tier2,tier3,tier4,tier5,data1,data2
1     1     1     1     1     big   tall
1     1     1     1     1     big   smelly
1     1     1     1     2     gross   tall
1     1     1     2     1     flatulent exceptional


desired output:
1     1     1     1     1     big,tall big,smelly                                  
                        2     gross,tall
                  2     1     flatulent,exceptional

虚构函数,只打印一个字段,如果它自上次打印的行以来已经改变,我们会称之为疯狂()

  select 
    crazy(tier1),
    crazy(tier2),
    crazy(tier3),
    crazy(tier4),
    crazy(tier5),
    listagg(data1||data2, ' ') within group(?)
  from table
  group by tier1,tier2,tier3,tier4,tier5

1 个答案:

答案 0 :(得分:0)

如果您知道列,那么您可能会使用CTE(取决于您使用的SQL版本)。如果这不起作用,那么我建议你在代码中完成你的工作。 SQL适用于基于SET的逻辑,而不适用于过程和函数(即使它们受支持)。与在代码中运行分析

相比,在每一行上运行5或6个函数的性能将会非常糟糕