2010-10-01 23 views
0

...其中“缺失记录”与最后记录的值相同,因此没有记录。选择缺失记录给定数据的最新值

可能是主观的,但我希望有一个这样做的标准化的方式。

因此,假设我在MySQL表中有一堆分析。有一些缺失的信息,但如上所述,这是因为他们以前的值与当前值相同。

table "table": 

id value  datetime 
1  5   1285891200 // Today 
1  4   1285804800 // Yesterday 
2  18   1285804800 // Yesterday 
2  16   1285771094 // The day before yesterday 

正如你所看到的,我没有今天的ID 2.

的值。如果我想拉从这个表中的“最近的值”(即1“今日“和2的‘昨天’?,我该怎么做,我已经通过运行下面的查询实现它:

SELECT id, value FROM (SELECT * FROM table ORDER BY datetime DESC) as bleh GROUP BY id

,它利用一个子查询,首先对数据进行排序,然后我靠” GROUP BY“从ea中选择第一个值(因为它是有序的,它是最近的) ch id。但是,我不知道是否推出子查询是获得最新价值的最佳方式。

你会怎么做?

所需的表:

id value  datetime 
1  5   1285891200 // Today 
2  18   1285804800 // Yesterday 

谢谢...

+0

昨天你想要什么价值? 4或18,或两者兼而有之? – nos 2010-10-01 15:09:56

+0

好点 - 我已经更新了问题以包含所需的表格。在这种情况下,我需要每个ID的最新值。 – 2010-10-01 15:11:15

回答

1

爱是爱的MySQL通过在一个子查询中允许的订单。那不是SQL标准:)

你可以重写查询,以标准方式投​​诉允许象:

select * 
from YourTable a 
where not exists 
     (
     select * 
     from YourTable b 
     where a.id = b.id 
     and  a.datetime < b.datetime 
     ) 

如果有,你不能在子查询裂开重复,你可以group by,然后选择一个任意值:

select a.id 
,  max(a.value) 
,  max(a.datetime) 
from YourTable a 
where not exists 
     (
     select * 
     from YourTable b 
     where a.id = b.id 
     and  a.datetime < b.datetime 
     ) 
group by 
     a.id 

这个选最大a.value分享最新datetime。现在datetime对于所有重复行都是相同的,但标准SQL不知道这一点,所以您必须指定一种方式从等同日期中选择。在这里,我使用的是max,但是min甚至avg也可以。

+0

不错!好的 - 但我们假设每个ID有多个值,所以我们可以比较并得到“最新” - 但这不能解释只有一个值的情况,因为它不会满足'a.datetime 2010-10-01 15:44:58

+0

@Julian H. Lam:条件落后于'not exists',所以如果不满意,它将被包含在结果集中。如果只有一个值,我希望查询能够工作。 – Andomar 2010-10-01 15:53:32