0

记录的状态可以是“renewal_required”。如果它进入此状态,并且申请人确实续订,则会生成一个副本,该副本进入状态“in_process”(但应用程序也可以出于其他原因具有状态“in_process”)。

现在我需要获取所有具有renew_required 状态的记录,但是,如果给定申请人的状态“in_process”中存在副本,我将只显示一个......关键是申请人ID,与复制记录相同。

| id | status               | applicant_id |
| 1  |    renewal_required  |       2      |
| 2  |    in_process        |       3      |  
| 3  |    renewal_required  |       4      |
| 4  |    in_process        |       4      |

在上面的示例中,将返回 id 为 1 和 4 的记录...

这可以做到吗?感谢您的任何建议(DB-redesign 除外,即使设计看起来很荒谬 - 现在对此无能为力)

解决方案需要用于 django,但如果提出 SQL 解决方案,我会很乐意接受并直接调整/执行

4

2 回答 2

0

在这里,一个可能的解决方案

SELECT MAX(t1.id) as max_id, t1.status, t1.applicant_id
  FROM t1
  JOIN (
    SELECT MIN(status) as status, applicant_id
      FROM t1
      WHERE status in ('renewal_required', 'in_process')
      GROUP by applicant_id ) tmp
    ON t1.status = tmp.status 
      AND t1.applicant_id = tmp.applicant_id
  GROUP BY t1.status, t1.applicant_id

SQL小提琴

编辑:重新考虑一下,如果状态多于这两个,现在这个将不起作用,因为SELECT MIN(status). 你能对此发表评论吗?

EDIT2:可能会这样。添加WHERE status in ('renewal_required', 'in_process')

于 2013-07-03T05:08:13.537 回答
0
select a.applicant_id,COALESCE(b.status,a.status) status from 
(select applicant_id,status from yourtable where status='renewal_required') a
left join 
(select applicant_id,status from yourtable where status='in_process')  b 
on a.applicant_id = b.applicant_id;

检查演示

于 2013-07-03T04:56:20.467 回答