获得最新的组和由ID

问题描述:

我停留在获得最新的独特的书的价值的总和获得最新的组和由ID

这是表看起来像

book_id  ordered_at(unix timestamp)         value 
1   1440630635 - assume this is July 1, 2015 8:00:00     250 
1   1440630635 - assume this is July 15, 2015 8:00:00      150 
1   1440630635 - assume this is July 30, 2015 8:00:00      100 
2   1440630635- assume this is July 5, 2015 8:00:00      200 
2   1440630635- assume this is July 20, 2015 8:00:00      300 
2   1440630635- assume this is July 30, 2015 8:00:00      200 

给出一个时间戳,我想通过本书

说,如果给定的时间戳是7月31日,2015年00:00:00获得最新订单的总价值,

查询应返回的300的和值,因为7月30日是最近的书1和2以及

1   1440630635 - assume this is July 30, 2015 8:00:00      100 
2   1440630635- assume this is July 30, 2015 8:00:00      200 

如果给定的时间戳2015年7月22日00:00:00

的查询应返回的450的和值,因为7月15日是最近期的预订1和7月20日是最近的书2

1   1440630635 - assume this is July 15, 2015 8:00:00      150 
2   1440630635- assume this is July 20, 2015 8:00:00      300 

编辑:我只寻找最最近和比给定日期更短

+0

试着寻找'ABS()'函数。你可以玩这个功能,以获得正确的结果 –

+0

你有什么尝试?这似乎是一个简单的聚合和限制查询,只要时间戳是IDENTICAL ...我怀疑它们是什么,你可能需要截断到一分钟...... SELECT sum(VALUE),ordered_At FROM tableName Group by Ordered_At order by ordered_At DESC limit 1' – xQbert

您可以在子查询中进行汇总,以便在上述日期(7月22日或7月31日或其他日期)之前找出每本书的最大日期。只有当日期更改为“2015年7月31日00:00:00”总结发现匹配子查询

-- your table structure may be different. This example serves just as a guide 
create table test (
    book_id int, 
    ordered_at datetime, 
    book_value int 
); 

insert into test values 
(1, '2015-07-01 08:00:00', 250), 
(1, '2015-07-15 08:00:00', 150), 
(1, '2015-07-30 08:00:00', 100), 
(2, '2015-07-05 08:00:00', 200), 
(2, '2015-07-20 08:00:00', 300), 
(2, '2015-07-30 08:00:00', 200); 

-- Result of this will be 450 
select sum(book_value) 
from test a 
inner join 
-- sub-query that gets the latest data for each book 
(
    select book_id, max(ordered_at) max_ordered_at 
    from test 
    where ordered_at < '2015-07-22 00:00:00' 
    group by book_id 
) b 
    on a.book_id = b.book_id and a.ordered_at = b.max_ordered_at; 

的记录,你的结果应该是300

如果愿望要查找与给定日期最接近的总计,可以使用以下查询:

-- Result: 450 
select sum(book_value) 
from test a 
inner join 
(
    select book_id 
      ,min(abs(unix_timestamp(ordered_at) - unix_timestamp('2015-07-22 00:00:00'))) as latest 
    from test 
    group by book_id 
) b 
    on a.book_id = b.book_id 
    and abs(unix_timestamp(a.ordered_at) - unix_timestamp('2015-07-22 00:00:00')) = b.latest; 
+0

看来OP的需求最接近给定的日期,不仅比给定的日期更小。 –

+0

良好的呼叫,@ RP-。改进的示例添加 – zedfoxus

+0

您的第一个查询是正确的答案。我只在特定的日期查找最近的日期,所以未来的日期不计算在内。第二个查询需要考虑将来的日期,这不是我的问题意图,只是要清楚。非常感谢你的帮助。 –