gpt4 book ai didi

sql-server - sql仅对连续行进行排名

转载 作者:行者123 更新时间:2023-12-03 00:31:56 28 4
gpt4 key购买 nike

我有一个查询,其中我根据 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

它的输出如下:

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

因此,除了最后 2 行之外,所有行都是正确的。我希望它们的排名为 1 和 2,而不是 2 和 3,因为带有“RD8-GH Endo”的行位于它们之间。那么我该怎么做呢?

最佳答案

您可以使用相关的子查询来实现此目的。使用这样的东西

DECLARE @t_opnames TABLE
(
Opnamenummer INT,
Patient_ID INT,
afdelingscode VARCHAR(100),
Opnametype VARCHAR(100),
Specialismen CHAR(2),
OntslagDatumTijd DATETIME
)

Insert into @t_opnames
SELECT 2983800 ,100006, 'RD8-GH MAU', 'Inpatient-E', 'GM', '2014-09-01 14:50:00.000'
UNION ALL SELECT 2983800 ,100006, 'RD8-GH MAU', 'Inpatient-E', 'GM', '2014-09-02 19:32:00.000'
UNION ALL SELECT 2983800 ,100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM', '2014-09-03 17:12:00.000'
UNION ALL SELECT 2983800 ,100006, 'RD8-GH Endo', 'Inpatient-E', 'GM', '2014-09-09 09:06:00.000'
UNION ALL SELECT 2983800 ,100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM', '2014-09-17 17:00:00.000'
UNION ALL SELECT 2983800 ,100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM', '2014-10-01 17:15:00.000'


;WITH CTE as
(
SELECT DENSE_RANK() OVER(ORDER BY Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd) rnk,*
FROM @t_opnames
)
SELECT rnk-ISNULL((
SELECT MAX(rnk)
FROM CTE c2
WHERE c2.Opnamenummer <= c1.Opnamenummer
AND c2.SPECIALISMEN <= c1.SPECIALISMEN
AND c2.OntslagDatumTijd <= c1.OntslagDatumTijd
AND c2.rnk < c1.rnk
AND (c2.Patient_ID <> c1.Patient_ID
OR c2.Opnametype <> c1.Opnametype
OR c2.afdelingscode <> c1.afdelingscode)),0) rnk,Patient_ID, Opnametype,afdelingscode,Opnamenummer, SPECIALISMEN, OntslagDatumTijd
FROM CTE c1
ORDER BY Patient_ID, Opnamenummer, SPECIALISMEN, Opnametype, OntslagDatumTijd

关于sql-server - sql仅对连续行进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29669770/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com