SQL确定字段的标志

时间:2014-03-13 19:20:46

标签: sql database

我有一个数据库,用于保存已打开和关闭的寄存器的历史记录

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"根本没有关闭。我无法找到一种切割方法来确定如何只获取当前打开的寄存器。关于如何处理这个的任何想法?请记住,随着时间的推移,将会有成千上万的这些。

3 个答案:

答案 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';

An SQLfiddle to test with

答案 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'

SQL Fiddle here