繁体   English   中英

SQL-SERVER 按 ROW_NUMBER 和其他条件过滤

[英]SQL-SERVER Filter By ROW_NUMBER and Another Condition

我有这个 SQL-SERVER 查询:

SELECT t.Id,
       t.ClientTemplateFieldId,
       t.ClientTemplateFieldOptionId,
       t.TextData,
       t.NumberData,
       t.DateTimeData,
       t.TreatmentDate,
       t.rn  FROM 
(
 SELECT  tfd.Id,
         tfd.ClientTemplateFieldId,
         tfd.ClientTemplateFieldOptionId,
         tfd.TextData,
         tfd.NumberData,
         tfd.DateTimeData,
         t.TreatmentDate,
         ROW_NUMBER() OVER (PARTITION BY tfd.ClientTemplateFieldId ORDER BY t.TreatmentDate DESC) as rn 
FROM TemplateFieldData tfd 
     INNER JOIN 
     Treatment t ON tfd.TreatmentId = t.Id
WHERE tfd.IsDeleted = 0 AND
      t.IsDeleted = 0 AND
      tfd.ClientId = 2 AND 
      t.ClientId = 2 AND 
      t.PatientId = 6003720 AND 
      tfd.ClientTemplateFieldId IN
     (1873,1874,1875,1876) 
) AS t

--WHERE CLAUSE... 

这是上述查询的表结果:

Id      ClientTemplateFieldId ClientTemplateFieldOptionId TextData NumberData   DateTimeData TreatmentDate              rn
4324    1873                  1627                        NULL     NULL         NULL         2021-01-14 09:00:00.000    1
4325    1873                  1628                        NULL     NULL         NULL         2021-01-14 09:00:00.000    2
4326    1873                  1631                        NULL     NULL         NULL         2021-01-14 09:00:00.000    3
4322    1873                  1627                        NULL     NULL         NULL         2021-01-13 09:00:00.000    4
4323    1873                  1629                        NULL     NULL         NULL         2021-01-13 09:00:00.000    5
4320    1873                  1626                        NULL     NULL         NULL         2021-01-12 22:00:00.000    6
4321    1873                  1630                        NULL     NULL         NULL         2021-01-12 22:00:00.000    7
4338    1874                  NULL                        SomeTxt  NULL         NULL         2021-01-14 09:00:00.000    1
4330    1874                  NULL                        SomeTxt  NULL         NULL         2021-01-13 09:00:00.000    2
4327    1874                  NULL                        SomeTxt  NULL         NULL         2021-01-12 22:00:00.000    3
4328    1875                  NULL                        NULL     10.00        NULL         2021-01-12 22:00:00.000    1
4331    1876                  1634                        NULL     NULL         NULL         2021-01-13 09:00:00.000    1
4329    1876                  1632                        NULL     NULL         NULL         2021-01-12 22:00:00.000    2

我应该在 Where 子句中放入什么才能检索 row_number = 1 的所有行,并且如果存在与 row_number = 1 的行之一具有相同 TreatmentDate 和 ClientTemplateFieldId 的行,我需要该行。

这意味着我需要这个结果:

Id      ClientTemplateFieldId ClientTemplateFieldOptionId TextData NumberData   DateTimeData TreatmentDate              rn
4324    1873                  1627                        NULL     NULL         NULL         2021-01-14 09:00:00.000    1
4325    1873                  1628                        NULL     NULL         NULL         2021-01-14 09:00:00.000    2
4326    1873                  1631                        NULL     NULL         NULL         2021-01-14 09:00:00.000    3
4338    1874                  NULL                        SomeTxt  NULL         NULL         2021-01-14 09:00:00.000    1
4328    1875                  NULL                        NULL     10.00        NULL         2021-01-12 22:00:00.000    1
4331    1876                  1634                        NULL     NULL         NULL         2021-01-13 09:00:00.000    1

您可以使用MAX() window function 而不是ROW_NUMBER()来获取每个ClientTemplateFieldId具有最新TreatmentDate的所有行:

SELECT t.Id,
       t.ClientTemplateFieldId,
       t.ClientTemplateFieldOptionId,
       t.TextData,
       t.NumberData,
       t.DateTimeData,
       t.TreatmentDate,
       t.rn  
FROM (
 SELECT  tfd.Id,
         tfd.ClientTemplateFieldId,
         tfd.ClientTemplateFieldOptionId,
         tfd.TextData,
         tfd.NumberData,
         tfd.DateTimeData,
         t.TreatmentDate,
         ROW_NUMBER() OVER (PARTITION BY tfd.ClientTemplateFieldId ORDER BY t.TreatmentDate DESC) AS rn, 
         MAX(t.TreatmentDate) OVER (PARTITION BY tfd.ClientTemplateFieldId) AS max_TreatmentDate
 FROM TemplateFieldData tfd 
     INNER JOIN 
     Treatment t ON tfd.TreatmentId = t.Id
 WHERE tfd.IsDeleted = 0 AND
      t.IsDeleted = 0 AND
      tfd.ClientId = 2 AND 
      t.ClientId = 2 AND 
      t.PatientId = 6003720 AND 
      tfd.ClientTemplateFieldId IN
     (1873,1874,1875,1876) 
) AS t  
WHERE t.TreatmentDate = t.max_TreatmentDate

ROW_NUMBER()实际上并不需要,但我将它保留在我的查询中,以防万一您希望它出现在结果中。

如果我假设整个查询结果(没有 where 条件)被创建为一个名为 T 的视图,例如,您可以执行以下操作:

SELECT *
FROM T 
WHERE T.rn = 1
OR EXISTS
    (SELECT 1 FROM T as T2 
    WHERE T2.TreatmentDate = T.TreatmentDate 
    AND T2.ClientTemplateFieldId = T.ClientTemplateFieldId 
    AND T.rn != 1 
    AND T2.rn = 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM