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,等等......
如果可能的话,我想避免任何子/嵌套查询。
请注意: 示例中的值或只是示例数据。真实的数据不是基于客户/订单,所以我恭敬地,谦卑地请求你不要责怪我将城市和公寓类型作为类别等(我会在这个例子中将它们放在单独的域表中)或建议更改架构
有人可以帮忙吗?!
史蒂夫
答案 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