Sql server 如何在SQL Server中按日期列排序组中的列

Sql server 如何在SQL Server中按日期列排序组中的列,sql-server,tsql,Sql Server,Tsql,我有以下样本数据: car_id owner_id service_date 1 user2 2016-01-02 00:00:00 1 user2 2016-03-02 00:00:00 1 user3 2016-11-02 00:00:00 1 user4 2017-01-02 00:00:00 1 user4 2017-02-12 00:00:00 1 user1 2017-03-22

我有以下样本数据:

car_id  owner_id    service_date
1        user2  2016-01-02 00:00:00
1        user2  2016-03-02 00:00:00
1        user3  2016-11-02 00:00:00
1        user4  2017-01-02 00:00:00
1        user4  2017-02-12 00:00:00
1        user1  2017-03-22 00:00:00
1        user2  2017-03-24 00:00:00
我试图在sql server中为给定的汽车id对owner\u id列进行排名

对于给定的car_id值,如果“owner_id”值不同于前一行中的“owner_id”值,则排名列应增加1,其中行按服务日期升序排序

预期产出:

car_id  owner_id    service_date    rnk
1        user2  2016-01-02 00:00:00 1
1        user2  2016-03-02 00:00:00 1
1        user3  2016-11-02 00:00:00 2
1        user4  2017-01-02 00:00:00 3
1        user4  2017-02-12 00:00:00 3
1        user1  2017-03-22 00:00:00 4
1        user2  2017-03-24 00:00:00 5
我试图通过划分汽车id和车主id来找到具有稠密秩函数的秩,但这会导致错误的秩

创建表tb_示例 汽车识别码, 所有者id NVARCHAR5, 服务日期时间 ; 在tb_示例中插入汽车id、车主id、服务日期值1、“用户2”、“2016-01-02”; 在tb_示例中插入汽车id、车主id、服务日期值1、“用户2”、“2016-03-02”; 在tb_示例中插入汽车识别号、车主识别号、服务日期值1、“用户3”、“2016-11-02”; 在tb_示例中插入汽车识别号、车主识别号、服务日期值1、“用户4”、“2017-01-02”; 在tb_示例中插入汽车识别号、车主识别号、服务日期值1、“用户4”、“2017-02-12”; 在tb_示例中插入汽车id、车主id、服务日期值1、“用户1”、“2017-03-22”; 在tb_示例中插入汽车id、车主id、服务日期值1、“用户2”、“2017-03-24”; 选择*, 按车辆id划分的密集等级,按服务日期划分的所有者id订单为rnk 从tb_的例子 按服务日期订购; 试试这个:

;WITH CTE AS
(
    SELECT *,           
            CASE 
              WHEN owner_id <> COALESCE(LAG(owner_id) OVER 
                                  (PARTITION BY car_id ORDER BY service_date), owner_id) 
                     THEN 1
              ELSE 0 
            END AS grp
    FROM #tb_example
)
SELECT *,
       SUM(grp) OVER (PARTITION BY car_id ORDER BY service_date) + 1 AS rnk
FROM cte 
ORDER BY service_date;
该查询使用LAG来检测同一个car\u id分区内的owner\u id的变化,其顺序由servic\u date定义

使用grp字段,我们使用SUMgrp OVER。。将排名计算为连续的变化总数。

您没有使用密集的排名,而是使用了排名