SQL - 抑制查询的重复列(而不是行)

时间:2011-04-19 20:43:42

标签: sql oracle

我有一个返回类似内容的查询......

数据集1:

EFFECTIVE_DATE END_DATE DESC                            SUBPART

4/10/2011                  Dairy Products Processing           L
4/10/2011                  360 CMR 10.000   
4/1/2011       4/9/2011    Dairy Products Processing            A
4/1/2011       4/9/2011    Ferroalloy Manufacturing             A

我希望获得一个返回该数据集的查询......

数据集2:

   EFFECTIVE_DATE END_DATE  DESC                            SUBPART

    4/10/2011                 Dairy Products Processing           L
                             360 CMR 10.000 
    4/1/2011        4/9/2011   Dairy Products Processing           A
                               Ferroalloy Manufacturing         A

请注意,重复生效日期(4/10/2011 - {null}和4/1/2011 - 4/9/2011)在重复时会被取消。

编辑1:回应@Justin Cave的回答,

以下是我与Justin Cave的模板合并的查询。它很接近,但有点偏。日期和描述看起来与它们应该是的有点混淆(数据集中的数据应该与数据集2中的数据相似:。我认为它可能与我的相关订购,但我不确定。

SELECT (CASE WHEN effective_date = prior_effective_date 
             THEN null
             ELSE effective_date
         END) effective_date,
       (CASE WHEN end_date = prior_end_date 
             THEN null
             ELSE end_date
         END) end_date,
       cfr_part_desc ,
       cfr_subpart
  FROM
    (SELECT c.effective_date,
            lag(c.effective_date) over (order by c.effective_date desc, cpl.cfr_part_desc asc) prior_effective_date,
            c.end_date,
            lag(c.end_date) over  (order by c.effective_date desc, cpl.cfr_part_desc asc) prior_end_date,
            cpl.CFR_PART_DESC as cfr_part_desc,
            cd.CFR_SUBPART as cfr_subpart
     from table1 c
      inner join table2 cd ON c.IND_ID = cd.IND_ID
                              AND cd.EFFECTIVE_DATE = c.EFFECTIVE_DATE
      inner join table3 cpl on cd.CFR_PART_L_S = cpl.CFR_PART_L_S 
      inner join table4 f on c.ind_id = f.ind_id
      inner join table5 p on f.ind_id = p.ind_id
    where p.PERMIT_S = '4988'
    order by c.effective_date desc, cpl.CFR_PART_DESC asc
    );

Image

编辑2:错误的数据是由于模糊地定义了列生效日期。上面的查询现在可以正常工作。

2 个答案:

答案 0 :(得分:4)

我认为你正在寻找使用分析函数的类似东西。我不清楚结果集是如何排序的,所以你必须填写它。你也可能能够将分析函数组合到你的查询中,而不是添加第三级嵌套。

SELECT (CASE WHEN effective_date = prior_effective_date 
             THEN null
             ELSE effective_date
         END) effective_date,
       (CASE WHEN end_date = prior_end_date 
             THEN null
             ELSE end_date
         END) end_date,
       description ,
       subpart
  FROM
    (SELECT effective_date,
            lag(effective_date) over 
                (order by effective_date desc, description asc) prior_effective_date,
            end_date,
            lag(end_date) over 
                (order by effective_date desc, description asc) prior_end_date,
            desc,
            subpart
       FROM <<your query>>)

答案 1 :(得分:1)

如果您使用SQL * Plus生成输出,则可以使用BREAK

BREAK ON EFFECTIVE_DATE ON END_DATE
SELECT ...