2013-04-04 57 views
0

我有一个查询SQL为每个符合条件

SELECT ckt, setpt, clock FROM progs 
WHERE feed = "80302" AND day=4 AND clock<"12:15:00" 
ORDER BY ckt, clock DESC 

这让我组中的一个条目是:

ckt setpt clock 
0 69 06:06:00 
0 62 00:30:00 
1 57 10:30:00 
1 67 04:30:00 
1 57 01:30:00 
2 69 11:00:00 
2 62 00:30:00 

我怎么能修改此查询给我MAX(时钟)为每个CKT

总数: 每个cktday具有许多setptclockentries。我正在寻找(1或没有)clock记录< some_time每个cktday。即

0 69 06:06:00 
1 67 10:30:00 
2 69 11:00:00 

在mysql中。

+1

当然了预期的效果'ckt' 1应该是'1 57 10:30:00',而不是'1 67 10:30:00'? (对于'ckt' 1,'setpt'在10:30:00的值为57,在提供的样本数据中。) – 2013-04-04 17:56:47

回答

4

这样的事情?

SELECT ckt, MAX(setpt), MAX(clock) 
FROM progs 
WHERE feed = "80302" AND day=4 AND clock<"12:15:00" 
GROUP BY ckt 
ORDER BY ckt, clock DESC 

结果

| CKT | MAX(SETPT) |      MAX(CLOCK) | 
----------------------------------------------------- 
| 0 |   69 | January, 01 1970 06:06:00+0000 | 
| 1 |   67 | January, 01 1970 10:30:00+0000 | 
| 2 |   69 | January, 01 1970 11:00:00+0000 |

See the demo

+0

这不起作用 - 首先ORDER BY应该在GROUP BY之后。其次,使用MAX(setpt)不会得到相同的结果。 – sgeddes 2013-04-04 17:47:48

+0

@sgeddes它得到相同的结果。修正了'ORDER BY'。 – Kermit 2013-04-04 17:48:52

+1

该查询会生成问题中包含的所需结果,但这些数据与OP请求的方法不匹配。来自OP的澄清是必需的。 – 2013-04-04 18:00:26

2

听起来像是你需要将表JOIN到自身,加入对MAX(clock)

SELECT p.ckt, p.setpt, p.clock 
FROM progs p 
    JOIN (
     SELECT MAX(clock) maxClock, ckt 
     FROM progs 
     WHERE feed = "80302" 
      AND day=4 
      AND clock<"12:15:00" 
     GROUP BY ckt 
    ) p2 on p.ckt = p2.ckt AND p.clock = p2.maxclock 
ORDER BY p.ckt, p.clock DESC 

SQL Fiddle Demo(其他岗位借用)

生产:

0 69 January, 01 1970 06:06:00+0000 
1 57 January, 01 1970 10:30:00+0000 
2 69 January, 01 1970 11:00:00+0000 

请注意,使用ID行1比你期望的结果不同,但符合你的问题的期望结果...

+0

我希望我知道如何解决问题并构建连接回答它。从你的sql我可以解构这里的想法是找到最大时间<12:30,然后通过将它加入内部查询的结果来添加setpt。谢谢 – mcktimo 2013-04-04 18:22:09

+0

@mcktimo - 小心使用已接受的解决方案 - 它只会为setpt返回一个任意值,如果您只是从ckt分组中删除最大值。很高兴我们可以帮忙! – sgeddes 2013-04-04 18:34:00