如何编写这两个(ANSI)SQL查询?

Sti*_*MAN 1 sql

我有一个表格,其数据如下所示:

create table demo_patient_info (
  attend timestamp,  
  patient_id int, 
  blood_pressure double
);
Run Code Online (Sandbox Code Playgroud)

我想编写(最好是ANSI)SQL查询,允许我执行以下操作:

QUERY1:

返回所有患者的bp之间的差异(使用WHERE子句限制笛卡尔积中返回的行数)

QUERY2:

返回每个患者的bp与表中一个特定(即指定)患者之间的差异

Pau*_*sey 5

1)

SELECT 
    t1.patient_id
   ,t2.patient_id
   ,t1.blood_pressure - t2.blood_pressure as bp_diff
FROM
   demo_patient_info t1
CROSS JOIN
   demo_patient_info t2
WHERE
   t1.patient_id < t2.patient_id
Run Code Online (Sandbox Code Playgroud)

2)

SELECT 
    t1.patient_id
   ,t2.patient_id
   ,t1.blood_pressure - t2.blood_pressure as bp_diff
FROM
   demo_patient_info t1
CROSS JOIN
   demo_patient_info t2
WHERE 
   t2.patient_id = 1
Run Code Online (Sandbox Code Playgroud)

这可能会为每个匹配提供两行,这可能是也可能不是

编辑: WHERE t1.patient_id < t2.patient_id在查询1中是为了防止以下,重复和自我匹配

ID1 ID2  diff 
1    2    1.4 
2    1    1.4 
1    1     0 
Run Code Online (Sandbox Code Playgroud)

感谢Jonathan Leffler的暗示:)

  • 应使用条件过滤CROSS JOIN - 通常是t1.patient_id <t2.patient_id以删除自我比较并仅列出每对一次. (3认同)