SQL查询协助(窗口功能)

SQL查询协助(窗口功能),sql,grouping,Sql,Grouping,全部, 我有一个像上面那样的结果集。 以熟悉的Customer->Orders模式为例, 前两列(例如Houston、公寓)来自Customer表上的category1和category2字段。 第三列来自Orders表,表示表的主键。此列中的值故意无序列出(1…5…3),以表明我无法保证值的顺序 我想要的是有一个列,添加一个排名或行数(或计算?),对类别1和类别2的每个组合进行编号: Houston Apartment Order 1 Houston Apartment

全部,

我有一个像上面那样的结果集。 以熟悉的Customer->Orders模式为例, 前两列(例如Houston、公寓)来自Customer表上的category1和category2字段。 第三列来自Orders表,表示表的主键。此列中的值故意无序列出(1…5…3),以表明我无法保证值的顺序

我想要的是有一个列,添加一个排名或行数(或计算?),对类别1和类别2的每个组合进行编号:

Houston Apartment         Order 1
Houston Apartment            Order 5
Houston TownHouse   Order 3
Houston TownHouse   Order 4
Austin  Condo   
Dallas  MultiFamily Order 2
休斯顿公寓是1号,休斯顿联排别墅是2号,等等

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

请注意: 示例中的值或仅示例数据。真实数据并非基于客户/订单,因此我谦恭地请求您不要批评我将城市和公寓类型作为类别等(在本例中,我会将它们放在单独的域表中),或建议更改模式

有人能帮忙吗


Steve

如果您的数据库支持窗口功能,您可以使用
行编号()


这样做应该可以:

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

根据您展示的结果,我认为您希望:

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

您似乎只添加了基于前两个类别的索引,并且从未重新开始(分区用于重新开始计数)。你的领带没有空隙(1,1,2…)。对于这种情况,您需要稠密的_rank()。如果您与间隙(1、1、3…)有关联,则可以使用rank()。如果您只是想要订购(1、2、3),您可以使用row_number()。

您使用的是哪种rdbms@安多玛说得很好,非常感谢。今晚我会试试这个,但知道还有另一个选择是令人兴奋的。我会更新选择这个作为答案,如果它的工作。再次感谢!稠密的等级()是我沮丧和祈祷的答案。我仍然需要使用partitionby来满足我的特定需求,但这是允许我解决问题的答案。我不得不在Matrix SSRS报告中使用它,这使我能够呈现一个漂亮、干净的表格,删除了空行。(这些空行是由Rank()创建的索引中的间隙造成的。)
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
select dense_rank() over (order by Category1, Category2) as rankorder, *
from Customers c join
     Orders o
     on o.CustomerID = c.CustomerID