协助SQL查询(窗口函数)

时间:2012-06-25 18:47:37

标签: sql grouping

Houston Apartment         Order 1
Houston Apartment            Order 5
Houston TownHouse   Order 3
Houston TownHouse   Order 4
Austin  Condo   
Dallas  MultiFamily Order 2

所有

我有一个像上面那样的结果集。 使用熟悉的客户 - >以订单架构为例, 前两列(例如Houston,Apartment)来自Customer Table上的category1和category2字段。 第三列来自Orders表,它将代表表的主键。本栏中的值是故意按顺序列出的(1 ... 5 ... 3),表明我无法保证订单的价值。

我想要的是一个列添加一个Rank或Row_number(或计算?),为第1类和第2类的每个组合编号:

1   Houston Apartment   Order 1
1   Houston Apartment   Order 5
2   Houston TownHouse            Order 3
2   Houston TownHouse   Order 4
3   Austin  Condo   
4   Dallas  MultiFamily Order 2

所以,Houston-Aparment是1,Houston-TownHouse是2,等等......

如果可能的话,我想避免任何子/嵌套查询。

请注意: 示例中的值或只是示例数据。真实的数据不是基于客户/订单,所以我恭敬地,谦卑地请求你不要责怪我将城市和公寓类型作为类别等(我会在这个例子中将它们放在单独的域表中)或建议更改架构

有人可以帮忙吗?!

史蒂夫

3 个答案:

答案 0 :(得分:1)

根据您显示的结果,我认为您想要:

select dense_rank() over (order by Category1, Category2) as rankorder, *
from Customers c join
     Orders o
     on o.CustomerID = c.CustomerID 

您似乎只是根据前两个类别添加索引,并且从不重新开始(该分区用于重新开始计数)。你没有间隙(1,1,2 ......)。对于这种情况,您需要dense_rank()。如果你有间隙(1,1,3 ......)的关系,你会使用rank()。如果你只想要订购(1,2,3),你可以使用row_number()。

答案 1 :(得分:0)

如果您的数据库支持窗口函数,则可以使用row_number()

select  row_number() over (partition by Category1, Category2 order by CustomerID)
from    Customers c
join    Orders o
on      o.CustomerID = c.CustomerID

答案 2 :(得分:0)

这样的事情应该做:

create table Data
(
    city varchar(50),
    propertyType varchar(50),
    anOrder int
)
insert into Data select 'Houston', 'Apartment', 1
insert into Data select 'Houston', 'Apartment', 5
insert into Data select 'Houston', 'TownHouse', 3
insert into Data select 'Houston', 'TownHouse', 4
insert into Data select 'Austin', 'Condo', 1
insert into Data select 'Dallas', 'MultiFamily', 2

select city, propertyType, RANK() OVER 
    (PARTITION BY Data.city ORDER BY Data.city,Data.propertyType DESC) AS Rank 
from Data
group by city, propertyType