2012-01-10 68 views
1

我有一张表,其中包含借给用户的计算机列表。每次机器退回时我们都会进行输入。我用下面的语句由用户,机器#,日期和动作选择组中的条件数据

SELECT Name, Asset#, Date, InOut 
FROM Table 
ORDER BY Asset#, date asc 

它返回

Name  Asset#  Date  InOut 
Jimmy  BER210 2009-05-08  out 
Jimmy  BER210 2009-06-08  in 
Jimmy  BER210 2009-07-08  out 
Sam  BER220 2009-05-08  out 
Sam  BER220 2009-06-08  In 
Jack  BER230 2009-05-08  out 
Jack  BER230 2009-06-08  In 
Jack  BER230 2009-07-08  out 

我寻找帮助修改查询只返回最近的一个项目,返回一个列表,并且只有当该机器当前不在时。

在此先感谢您提供的任何环境!

回答

3

可以使用inner join过滤掉每台机器旧的行。一旦你有最新的行,where可以用来选择“出”的机器。

select Name, Asset#, Date, InOut 
from Table t 
join (
     select Asset# 
     ,  max(Date) as MaxDate 
     from Table 
     group by 
       Asset# 
     ) filter 
on  filter.Asset# = t.Asset# 
     and filter.MaxDate = t.Date 
where t.InOut = 'Out' 
+0

upvote for a correct answer,并纠正其他人的 – 2012-01-10 21:49:08

+0

像梦一样工作。谢谢! – jimb0z 2012-01-11 08:23:37

0

在SQLServer的

SELECT TOP 1 Name, Asset#, Date, InOut 
FROM Table 
WHERE InOut = 'out' 
ORDER BY Date DESC 

在MySQL

SELECT Name, Asset#, Date, InOut 
FROM Table 
WHERE InOut = 'out' 
ORDER BY Date DESC 
LIMIT 1 
+0

这将返回最晚时间机器出去?不要以为这是OP后 – Andomar 2012-01-10 21:36:07

0
SELECT Name, Asset#, Date, InOut 
FROM Table o 
WHERE Date = (select max(Date) from 
       Table i 
       where i.Asset# = o.Asset# 
      ) 
) 
where o.in_out = 'out' 
ORDER BY Asset#, date asc 

编辑改变i.in_outo.in_out按评论。

+0

应该工作,如果你改变'where i.in_out'到'where o.in_out' – Andomar 2012-01-10 21:37:11

+0

谢谢你指出我的错误。你是对的。我编辑了答案。 – 2012-01-10 21:39:36

1
select Name, Asset#, Date, InOut 
from Table 
    natural join (
    select Asset#, max(Date) as Date 
    from Table 
    group by Asset# 
) 
where InOut = 'out' 
order by date desc 

固定

+0

'InOut ='out''不应该在子查询之外吗? – Andomar 2012-01-10 21:35:18

+0

否。子查询正在返回最近结帐的资产和日期。完整的查询与主表连接以获取整个记录。但是,如果在特定日期有多次结帐,这可能会出现奇怪的现象。我需要根据真实的数据检查结果,你可能是对的:) – 2012-01-10 21:38:51

+1

OP说“只有当该机器当前没有。”目前形式的这个答案会显示一台机器在最新的“出”记录后有一个“in”记录。 – Andomar 2012-01-10 21:41:36

0

SELECT名称,资产号,日期的InOut

FROM表,其中的InOut = '出' ORDER BY日期递减