簡體   English   中英

SQL Server通過匯總選擇一列,但不選擇另一列

[英]SQL Server Select one column by aggregate but not another

用sql不好。 如果問題不是100%清楚,請原諒我。 這是我的查詢

SELECT 
     MAX(PatientId),
  [Date],
  [Time],
  CASE WHEN MAX(CAST(HealthScoreSkipped as INT)) = 1
    THEN '--'
    ELSE MAX(DailyHealthScore)
  END DailyHealthScore,
  ProtocolGroupName,
  MAX(BloodPressure) BloodPressure,
  MAX(SystolicAlert) SystolicAlert,
  MAX(DiastolicAlert) DiastolicAlert,
  MAX(BloodPressureSkipped) BloodPressureSkipped,
  MAX(Pulse) Pulse,
  MAX(PulseAlert) PulseAlert,
  MAX(PulseSkipped) PulseSkipped,
  MAX(BloodSugar) BloodSugar,
  MAX(BloodSugarAlert) BloodSugarAlert,
  MAX(BloodSugarSkipped) BloodSugarSkipped,
  MAX(Steps) Steps,
  MAX(StepsAlert) StepsAlert,
  MAX(StepsSkipped) StepsSkipped,
  MAX(O2) O2,
  MAX(O2Alert) O2Alert,
  MAX(O2Skipped) O2Skipped,
  MAX(Weight) Weight,
  MAX(WeightAlert) WeightAlert,
  @BaselineWeight AS BaselineWeight,
  MAX(WeightSkipped) WeightSkipped,
  MAX(Temperature) Temperature,
  MAX(TemperatureAlert) TemperatureAlert,
  MAX(TemperatureUnit) TemperatureUnit,
  MAX(TemperatureSkipped) TemperatureSkipped,
  MAX(PEF) PEF,
  MAX(PEFAlert) PEFAlert,
  MAX(PEFSkipped) PEFSkipped,
  MAX(FEV1) FEV1,
  MAX(FEV1Alert) FEV1Alert,
  MAX(FEV1Skipped) FEV1Skipped,
  MAX(FEVRatio) FEVRatio,
  MAX(FEVRatioAlert) FEVRatioAlert,
  MAX(FEVRatioSkipped) FEVRatioSkipped,
  @SpiroEnabled SpiroEnabled
   FROM @bioAndScores
    GROUP BY PatientId, Date, Time, ProtocolGroupName

這里的問題就在網上

MAX(Steps) Steps,
MAX(StepsAlert) StepsAlert

我想選擇最大步數,但選擇該行附帶的stepalert值,而不是stepAlert的最大值。

您可以在select語句中創建一個子查詢,以獲取與您的步驟相對應的步驟警報。 類似於以下內容(請注意,我不確定為什么要按PatientId分組,如果要使用max(PatientId)如果要按患者ID分組,則子查詢的where子句也應匹配患者ID

SELECT 
    MAX(bas.PatientId),
    bas.[Date],
    bas.[Time],
    bas.ProtocolGroupName,
    .
    .
    .
    MAX(bas.Steps) Steps,
    --sub query to get the StepsAlert that corresponds to max steps
    (SELECT 
        StepsAlert 
    FROM 
        @bioAndScores subBas 
    WHERE
        --This is the important part of finding the match for Max Steps
        MAX(bas.Steps) = subBas.Steps AND
        --commented out because the MAX(PatientId) was ambiguous
        --bas.PatientId = subBas.PatientId AND
        bas.[Date] = subBas.[Date] AND
        bas.[Time] = subBas.[Time] AND
        bas.ProtocolGroupName = subBas.ProtocolGroupName) as StepsAlert 
FROM
    @bioAndScores as bas
GROUP BY
    --PatientId, 
    bas.Date, 
    bas.Time, 
    bas.ProtocolGroupName

從StepAlerts中刪除MAX()函數,並將StepAlerts添加到GROUP BY子句中。

MAX(Steps) AS Steps,
StepsAlert AS StepsAlert

在您的GROUP BY中:

GROUP BY PatientId, Date, Time, ProtocolGroupName, StepAlerts

只需將StepsAlert列添加到group by子句並刪除MAX聚合函數即可。

GROUP BY PatientId, Date, Time, ProtocolGroupName,StepsAlert 

我建議您仔細研究一下以便更好地了解分組方式。

您可以使用apply()選擇最早的StepsAlert與最高Steps相對應的一組值,如下所示:

select 
    PatientId
  , [Date]
  , [Time]
  , DailyHealthScore    = case 
      when MAX(CAST(HealthScoreSkipped as int))= 1 then '--' 
      else MAX(DailyHealthScore) 
      end 
  , ProtocolGroupName
  , BloodPressure       = MAX(BloodPressure)
  , SystolicAlert       = MAX(SystolicAlert)
  , DiastolicAlert      = MAX(DiastolicAlert)
  , BloodPressureSkipped= MAX(BloodPressureSkipped)
  , Pulse               = MAX(Pulse)
  , PulseAlert          = MAX(PulseAlert)
  , PulseSkipped        = MAX(PulseSkipped)
  , BloodSugar          = MAX(BloodSugar)
  , BloodSugarAlert     = MAX(BloodSugarAlert)
  , BloodSugarSkipped   = MAX(BloodSugarSkipped)
  , Steps               = x.Steps
  , StepsAlert          = x.StepsAlert
  , StepsSkipped        = MAX(StepsSkipped)
  , O2                  = MAX(O2)
  , O2Alert             = MAX(O2Alert)
  , O2Skipped           = MAX(O2Skipped)
  , Weight              = MAX(Weight)
  , WeightAlert         = MAX(WeightAlert)
  , BaselineWeight      = @BaselineWeight
  , WeightSkipped       = MAX(WeightSkipped)
  , Temperature         = MAX(Temperature)
  , TemperatureAlert    = MAX(TemperatureAlert)
  , TemperatureUnit     = MAX(TemperatureUnit)
  , TemperatureSkipped  = MAX(TemperatureSkipped)
  , PEF                 = MAX(PEF)
  , PEFAlert            = MAX(PEFAlert)
  , PEFSkipped          = MAX(PEFSkipped)
  , FEV1                = MAX(FEV1)
  , FEV1Alert           = MAX(FEV1Alert)
  , FEV1Skipped         = MAX(FEV1Skipped)
  , FEVRatio            = MAX(FEVRatio)
  , FEVRatioAlert       = MAX(FEVRatioAlert)
  , FEVRatioSkipped     = MAX(FEVRatioSkipped)
  , SpiroEnabled        = @SpiroEnabled
from @bioAndScores b
  cross apply (
    select top 1
        i.Steps
      , i.StepsAlert
    from @bioAndScores i
    where b.PatientId = i.PatientId
      and b.[Date] = i.[Date]
      and b.[Time] = i.[Time]
      and b.ProtocolGroupName = i.ProtocolGroupName
    order by i.Steps desc, i.StepsAlert asc
      ) x
group by 
    PatientId
  , date
  , time
  , ProtocolGroupName

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM