只获得最大值

时间:2016-06-17 10:21:58

标签: sql sql-server join group-by

我有三张桌子

  • 计算机 (计算机列表)
  • 事件 (机器事件列表,例如事件ID,机器名称,开始和停止时间段)
  • eventdetails (有关事件ID和计算机名称指定的每个事件的详细信息)

我想执行一个查询,它连接每台机器的max event id数据,但是我在分组方面遇到了一些问题。

台式机:

machine
-----------
Machine 1
Machine 2

表格事件:

eventid | machine   | start      | stop
-----------------------------------------------
      1 | Machine 1 | 2016-06-14 | 2016-06-16
      2 | Machine 1 | 2016-06-16 | null
      1 | Machine 2 | 2016-05-30 | null

表格eventdetails:

eventid | machine   | name       | value
-----------------------------------------------
      1 | Machine 1 | product    | Product 1
      1 | Machine 1 | person     | Samuel

我尝试过以下查询,但每台机器返回多行......我想按机器分组,只根据最大事件ID获取数据。

SELECT m.machine, MAX(e.eventid), e.start, e.stop, d.name, d.value
FROM machine m 
JOIN event e ON e.machine = m.machine
JOIN eventdetails d ON d.eventid = e.eventid AND d.machine = m.machine
GROUP BY m.machine, e.start, e.stop, d.name, d.value

提前致谢。

1 个答案:

答案 0 :(得分:2)

给这个人一个机会。它为您提供了一个内部联接,它将禁止event表中的任何内容与同一个表中的max(eventid)不相等。

SELECT m.machine, e.eventid, e.start, e.stop, d.name, d.value
FROM machine m 
INNER JOIN event e ON e.machine = m.machine
INNER JOIN eventdetails d ON d.eventid = e.eventid AND d.machine = m.machine
INNER JOIN (SELECT machine, MAX(eventid) maxevent FROM event GROUP BY machine) ma ON m.machine = ma.machine AND e.eventid = ma.maxevent
GROUP BY m.machine, e.start, e.stop, d.name, d.value