在考虑地区的同时将房屋号码汇总到MIN和MAX

时间:2017-08-07 09:06:39

标签: mysql sql max min

我想获得MIN / MAX门牌号,这是一项简单的任务。

但是有一个包含区域的列。

原始数据:

Street Name | House Number | district
Hauptstr.   |          1   |    A
Hauptstr.   |          2   |    A
Hauptstr.   |          3   |    B
Hauptstr.   |          4   |    B
Hauptstr.   |          5   |    A

期望输出:

Street Name | House number (FROM) |  House number (TO) |  district
Hauptstr.   |          1          |           2        |     A
Hauptstr.   |          3          |           4        |     B
Hauptstr.   |          5          |           5        |     A

我的输出:

Street Name | House number (FROM) |  House number (TO) |  district
Hauptstr.   |          1          |           5        |     A
Hauptstr.   |          3          |           4        |     B

我愿意接受意见和建议。我是否需要临时表来处理地址?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用变量在MySQL中执行此操作。它为相邻街道值的每一行分配一个组:

select street, district, min(housenumber), max(housenumber)
from (select t.*,
             (@grp := if(@d = district, @grp,
                         if(@d := district, @grp + 1, @grp + 1)
                        )
             ) as grp
      from t cross join
           (select @d := '', @grp := 0) params
      order by street, housenumber
     ) t
group by grp, street, district;

答案 1 :(得分:0)

假设您正在开发支持它们的SQL实现,您可以在(未经测试的)

行中使用FIRST_VALUELAST_VALUE等分析函数
select streetname
      ,first_value(housenumber) over (order by streetname, housenumber partition by district) as from
      ,last_value(housenumber) over (order by streetname, housenumber partition by district) as to
      ,district
from table 

编辑:该查询不起作用,但这些内容应该是。

EDIT2:这是一种(有点复杂)的方式

select *
from (
    select streetname
          ,district
          ,from_num
          ,coalesce(to_num,lead(to_num,1) over (partition by streetname order by housenumber)) as to_num
    from (
        select streetname
              ,housenumber
              ,district
              ,case when coalesce(lag(district,1) over (partition by streetname order by housenumber),'') <> district then housenumber end as from_num
              ,case when coalesce(lead(district,1) over (partition by streetname order by housenumber),'') <> district then housenumber end as to_num
        from table
        )
    where from_num is not null or to_num is not null
)
where from_num is not null

这是在DB2中测试的。我不了解MaxDB,因此您可能需要调整语法。 至于发生了什么的解释:

  1. 在第一遍(最内部子查询)中,我首先查看(即,当前一个区域与当前区域不同时)和最后一个(即,当下一个区域将与当前区域不同时)每个区域的记录按街道名称和门牌号码排序的地区组。如果是第一个,那么我将门牌号码存储为&#39;来自&#39 ;;如果是最后一次,我将其存储为&#39;
  2. 由此,我只选择每个组的第一个和最后一个记录(即,填写了&#39;来自&#39;或&#39;到&#39;值的那些。这让我知道了每组最多2个记录,每个记录最多2个记录。对于没有填入“&#39”值的每个记录,我用下一个记录中的记录填写。
  3. 剩下要做的就是从这个子结果中选择那些同时填入两个值的记录,瞧!