sql排名只有连续的行

Hem*_*dia 5 sql-server rows continuous rank sql-server-2008

我有一个查询,我在3列的基础上排名行.我成功地这样做了,除了如果任何行在这3列中包含相同的数据,即使它在输出中不连续,它也会给它下一个等级.我希望如果任何行匹配这些列中的数据,只有当它在连续的行中时才应该给出下一个等级,如果不是那么它应该再次给它排名为1.我尝试了以下代码:

  SELECT DISTINCT DENSE_RANK () OVER (PARTITION BY Patient_ID, 
                                                 Opnametype, 
                                                 afdelingscode ORDER BY  Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd) AS rnk, 
                *
  FROM t_opnames
  ORDER BY Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd
Run Code Online (Sandbox Code Playgroud)

它输出为:

rnk Opnamenummer Patient_ID afdelingscode     Opnametype   Specialismen  OntslagDatumTijd ...
1   2983800      100006     RD8-GH MAU        Inpatient-E  GM            2014-09-01 14:50:00.000
2   2983800      100006     RD8-GH MAU        Inpatient-E  GM            2014-09-02 19:32:00.000
1   2983800      100006     RD8-GH Ward 08    Inpatient-E  GM            2014-09-03 17:12:00.000  
1   2983800      100006     RD8-GH Endo       Inpatient-E  GM            2014-09-09 09:06:00.000
2   2983800      100006     RD8-GH Ward 08    Inpatient-E  GM            2014-09-17 17:00:00.000
3   2983800      100006     RD8-GH Ward 08    Inpatient-E  GM            2014-10-01 17:15:00.000
Run Code Online (Sandbox Code Playgroud)

因此,除了最后2行之外,所有行都是正确的.我希望它们的等级为1和2而不是2和3,因为带有"RD8-GH Endo"的行位于它们之间.那我该怎么办呢?

Hem*_*dia 1

最后我得到了查询的解决方案,现在我得到了我想要的输出,并且在 3 秒内运行了超过 75k 行。我使用的代码是:

SELECT DISTINCT ROW_NUMBER () OVER (ORDER BY Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd) AS rownum, 
            * INTO #temp
FROM t_opnames
ORDER BY Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd;

WITH CTE
AS (SELECT *, 
           ROW_NUMBER () OVER (ORDER BY rownum) - ROW_NUMBER () OVER (PARTITION BY Patient_ID, 
                                                                                   Opnametype, 
                                                                                   afdelingscode ORDER BY rownum) AS RowGroup
      FROM #temp) 
SELECT ROW_NUMBER () OVER (PARTITION BY RowGroup, 
                                        Patient_ID, 
                                        Opnametype, 
                                        afdelingscode ORDER BY rownum) AS GroupSequence, 
       *
  FROM CTE
  ORDER BY rownum;

DROP TABLE #temp;
Run Code Online (Sandbox Code Playgroud)

我参考了此页面上发布的示例