SQL查询过滤按条件返回行

时间:2015-12-08 09:01:08

标签: sql postgresql greatest-n-per-group

我需要帮助过滤查询返回的结果行。我有一个疾病表,其中百分比疾病日期

SELECT I.percent, I.illness, I.date
FROM Illnesses I
INNER JOIN Person P on I.person_id = P.id  // an inner join I use in where clause
WHERE P.id = someId    //  13 let's say

所以在我的情况下,对于id = 13的人,查询'将返回

51, someIllness, 2015-12-07
43,someOtherIllness, 2015-12-08
null, anotherIllness, 2015-12-08

我需要选择日期最近的行,如果有多个行具有该日期,则需要选择最高百分比。我在where子句

中添加了以下代码
AND I.date = (SELECT max(I2.date)
FROM Illnesess I2
INNER JOIN Person P2 on I2.person_id = P2.id
WHERE P2.id = P.id)
AND I.percent = (SELECT max(I2.percent)
FROM Illnesess I2
INNER JOIN Person P2 on I2.person_id = P2.id
WHERE P2.id = P.id AND I2.date = I.date)

这将返回 43,someOtherIllness,2015-12-08 ,并且至少我会这样认真工作。我需要涵盖一个例外情况,如果最近的日期百分比是 null 我需要使用前一个日期具有百分比的行。

51, someIllness, 2015-12-07
null,someOtherIllness, 2015-12-08
null, anotherIllness, 2015-12-08 

51,someIllness,2015-12-07将是我需要的结果。

如果有人帮忙,我会感激不尽。谢谢。

2 个答案:

答案 0 :(得分:0)

如果您将从头开始删除所有没有百分比的疾病?

SELECT I.percent, I.illness, I.date
FROM Illnesses I
INNER JOIN Person P on I.person_id = P.id  // an inner join I use in where clause
WHERE P.id = someId
AND I.percent IS NULL

答案 1 :(得分:0)

你可以试试这个

SELECT I.percent, I.illness, I.date 
FROM Illnesses I
INNER JOIN Person P on I.person_id = P.id
WHERE I.percent IS NOT NULL 
ORDER BY I.date, I.percent DESC
LIMIT 1

如果您希望按最高百分比排序,可以尝试按顺序交换日期和百分比位置