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

全部,

我有一个类似上面的结果集。以熟悉的 Customer -> Orders 模式为例,前两列(例如 Houston、Apartment)来自 Customer 表上的 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,等等...

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

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

有人可以帮忙吗?!

史蒂夫

4

3 回答 3

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()。

于 2012-06-25T18:58:35.110 回答
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
于 2012-06-25T18:58:27.803 回答
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
于 2012-06-25T18:52:14.483 回答