我有一个数据库,用于保存已打开和关闭的寄存器的历史记录
id | name | assigned_to | state | created_on | created_by
---------------------------------------------------------
1 | Jay | 1 | OPEN | 01/01/2011 | 1
2 | Kay | 2 | OPEN | 01/01/2011 | 1
3 | Jay | 1 | CLOSED| 01/01/2111 | 1
" assigned_to"是员工的身份证明。 "名称"是他们使用的寄存器的名称。
数据库说的是" Jay"已经开放和关闭,但" Kay"根本没有关闭。我无法找到一种切割方法来确定如何只获取当前打开的寄存器。关于如何处理这个的任何想法?请记住,随着时间的推移,将会有成千上万的这些。
答案 0 :(得分:2)
做出一些假设,您可以将其解决为" set-within-sets"子查询。主要假设是name
已关闭"只有一次,之后不再打开。以下查询检查没有closed
状态:
select r.name
from registers r
group by r.name
having sum(case when state = 'Closed' then 1 else 0 end) = 0;
如果关闭后可以打开name
,那么您需要检查每个select r.name
from registers r
group by r.name
having sum(case when state = 'Closed' then 1 else 0 end) = 0 or
max(case when state = 'Closed' then id end) > max(case when state = 'Opened' then id end);
的最近时间。你可以试试这个:
{{1}}
答案 1 :(得分:0)
您只需使用ROW_NUMBER()
获取每个名称的最新值,并列出最新状态等于OPEN
的那些;
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY created_on DESC, id DESC) rn
FROM myTable
)
SELECT id, name, assigned_to, state, created_on, created_by
FROM cte WHERE rn=1 AND state='OPEN';
答案 2 :(得分:0)
只有当状态为" CLOSED"时,才会生成带有最新created_on(按名称)的行。
select
*
from
regs a
join (select name,max(created_on) created_on
from regs
group by name) b
on a.name = b.name
where
a.created_on = b.created_on
and state = 'CLOSED'