复杂的django或SQL查询

时间:2013-07-03 04:40:20

标签: sql django

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

现在我需要获取具有renewal_required状态的所有记录,但是,如果给定申请人的状态'in_process'中存在副本,我只会显示一个...密钥是applicant_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重新设计,即使设计看起来很荒谬 - 现在也无法做任何事情)

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

2 个答案:

答案 0 :(得分: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;

检查DEMO

答案 1 :(得分: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 Fiddle

编辑:反思它,如果由于SELECT MIN(status)而有更多的状态而不仅仅是这两个,那么现在这个将不起作用。你能评论一下吗?

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