2017-10-04 57 views
0

我需要通過使用基於多個字段的一些條件邏輯來對SQL Server 2014表中的某些記錄進行分組,並且我不知道如何執行此操作。我創造了一個人爲的例子來解釋我期待的結果。在SQL中進行分組時的條件邏輯

這是患者醫療程序的一個表:

+----+-------+-----------+---------------+---------------+ 
| Id | Name | Insurance | ProcedureName | ProcedureDate | 
+----+-------+-----------+---------------+---------------+ 
| 1 | Bob | Medicaid | Blood Test | 2017-06-01 | 
+----+-------+-----------+---------------+---------------+ 
| 2 | Bob | Medicaid | Urinalysis | 2017-06-03 | 
+----+-------+-----------+---------------+---------------+ 
| 3 | Bob | Self Pay | Liver Biopsy | 2017-05-02 | 
+----+-------+-----------+---------------+---------------+ 
| 4 | Bob | Self Pay | CAT Scan | 2017-05-07 | 
+----+-------+-----------+---------------+---------------+ 
| 5 | Sally | Medicaid | Ultrasound | 2017-07-07 | 
+----+-------+-----------+---------------+---------------+ 
| 6 | Sally | Medicaid |  X-Ray  | 2017-07-12 | 
+----+-------+-----------+---------------+---------------+ 
| 7 | Sally | Medicaid | Blood Test | 2017-08-10 | 
+----+-------+-----------+---------------+---------------+ 

我的名字,這樣我只能用兩個記錄結束了喜歡羣體這些記錄。一個是Bob和一個是Sally。由於字段保險,ProcedureNameProcedureDate保存不同的值我意識到我需要決定哪些值用於分組中的這些字段。以下是規則:

  1. 如果保險是醫療補助以外的任何其他方式,請使用非醫療補助記錄中的數據和最新的程序日期。
  2. 如果保險是全部醫療補助金,則使用最近ProcedureDate的行中的數據。

所以,我想用下面的兩個記錄落得:

+----+-------+-----------+---------------+---------------+ 
| Id | Name | Insurance | ProcedureName | ProcedureDate | 
+----+-------+-----------+---------------+---------------+ 
| 4 | Bob | Self Pay | Liver Biopsy | 2017-05-02 | 
+----+-------+-----------+---------------+---------------+ 
| 7 | Sally | Medicaid | Blood Test | 2017-08-10 | 
+----+-------+-----------+---------------+---------------+ 

我對這個問題創造了一個sample SqlFiddle here。如何在GROUP BY子句中使用條件邏輯來獲得我想要的答案?

+0

預期的結果不鮑勃符合標準1。 –

+0

@Vamsi - 謝謝!我花了很多時間設置它,我得到的數據不正確。我修正了結果。 – webworm

+0

這兩個規則中,你需要記錄的數據與最近的日期? –

回答

3

這是一個優先級查詢。在row_numberorder by中使用case表達式與上述條件。

select top 1 with ties * 
from tbl 
order by row_number() over(partition by name order by 
          case when insurance<>'Medicaid' then 1 else 2 end, 
          proceduredate desc) 
+0

我檢查了Sql小提琴中的SQL,它的工作原理。只需將'tbl'改爲'PatientProcedure'即可。 – webworm

1

我把這個糟糕的解決方案放在一起。它不能與Vamsi Prabhala解決方案進行比較,但是,我認爲這是正確的,因此我將它發佈在此處。

select p1.* 
from PatientProcedure p1 
left join (select p2.name, max(p2.ProcedureDate) m from PatientProcedure p2 group by p2.name) t1 on t1.name = p1.name 
left join (select p2.name, max(p2.ProcedureDate) m, count(p2.ProcedureDate) ct from PatientProcedure p2 where p2.insurance != 'Medicaid' group by p2.name) t2 on t2.name = p1.name 
where 
(
    t2.ct is null and 
    ProcedureDate = t1.m 
) or 
(
    insurance != 'Medicaid' and 
    ProcedureDate = t2.m 
) 

我認爲這兩個LEFT JOIN s時,可以歸納爲好,但是,也許下一次:)

+0

該查詢有效。我在Sql Fiddle – webworm

+0

@webworm中測試過它,但絕對使用他的解決方案:) –