SQL查询同时获取group by和distinct值

时间:2010-08-13 01:23:45

标签: sql oracle plsql aggregate-functions

我在尝试为此表定义SQL查询时遇到问题:

在访问时记录患者及其体重读数表,其中包括以下列:

  • 患者ID
  • 体重读数
  • 访问ID(每次访问一次)

换句话说,如果在两个记录中两个访问ID相同,则在同一访问日期已经进行了两次重量读数。

我有这个问题“让所有患者至少有两个体重读数超过150”:

select patient_id 
  from patients 
 where weight_val > 50 
group by patient_id 
  having count(*) >= 2

这是我的问题:如果我想修改此查询以便查询以下内容该怎么办:

  1. “让所有患者在不同的就诊时至少有两个重量读数超过150”
  2. “让所有患者在同一次就诊时至少有两个体重读数超过150”
  3. 是否可以在不删除“分组依据”声明的情况下执行此操作?如果没有,你推荐的方法是什么?如果它更容易(我正在使用Oracle),我也愿意添加日期列而不是访问ID。

2 个答案:

答案 0 :(得分:9)

不同的次访问中至少有两个体重读数高于150的患者

使用:

  SELECT p.patient_id 
    FROM PATIENTS p
   WHERE p.weight_val > 150 
GROUP BY p.patient_id 
  HAVING COUNT(DISTINCT p.visit_id) >= 2

相同的访问中至少有两个体重读数高于150的患者

使用:

  SELECT DISTINCT p.patient_id 
    FROM PATIENTS p
   WHERE p.weight_val > 150 
GROUP BY p.patient_id, p.visit_id
  HAVING COUNT(*) >= 2

答案 1 :(得分:1)

尝试这样:

1

select patient_id 
  from patients 
 where weight_val > 150 
group by patient_id 
  having count(*) >= 2 and count(*) = count(distinct visit_id);

2

select patient_id 
  from patients 
 where weight_val > 150 
group by patient_id 
  having count(*) >= 2 and count(distinct visit_id) = 1;