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"的行位于它们之间.那我该怎么办呢?
最后我得到了查询的解决方案,现在我得到了我想要的输出,并且在 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)
我参考了此页面上发布的示例
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |