TCP地址的最大日期组

时间:2013-03-14 21:48:45

标签: sql greatest-n-per-group

我想要的是什么:我遇到了每组最大的问题。我的组是一组TCP地址,n是表行插入数据库的日期。

问题:我目前正在使用与我的where子句匹配的tcp地址获取所有行,而不是每个tcp地址具有最大日期的行。

我正在尝试关注此示例并失败:SQL Select only rows with Max Value on a Column

这是我的桌子的样子。

CREATE TABLE IF NOT EXISTS `xactions` (
  `id` int(15) NOT NULL AUTO_INCREMENT,
  `tcpAddress` varchar(40) NOT NULL,
   //a whole lot of other stuff in batween
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=150 ;

示例行

ID | tcpAddress     | ...  | date
1  |  192.168.1.161 | ...  | 2012-09-12 14:19:39
2  |  192.168.1.162 | ...  | 2012-09-12 14:19:40
3  |  192.168.1.162 | ...  | 2012-09-12 14:19:41
4  |  192.168.1.162 | ...  | 2012-09-12 14:19:42

SQL语句我正在尝试使用

select yt.id, yt.tcpAddress, yt.analog, yt.discrete, yt.counter, yt.date
from xactions yt
inner join(
    select id, tcpAddress, analog, discrete, counter, max(date) date
    from xactions
    WHERE tcpAddress='192.168.1.161' OR tcpAddress='192.168.1.162'
    group by date
) ss on yt.id = ss.id and yt.date= ss.date

2 个答案:

答案 0 :(得分:1)

您需要按tcpAddress分组,而不是按日期分组。

并通过tcpAddress加入,而不是id。

select yt.id, yt.tcpAddress, yt.analog, yt.discrete, yt.counter, yt.date 
from xactions yt 
inner join ( 
  select tcpAddress, max(date) date 
  from xactions 
  where tcpAddress in ('192.168.1.161', '192.168.1.162')
  group by tcpAddress
 ) ss using (tcpAddress, date);

此外,您不需要在派生表中选择任何额外的列 - 只需要tcpAddress和max(date)。

答案 1 :(得分:1)

您也可以使用EXISTS()选项。在EXISTS()中为每组tcpAddress找到MAX(日期) 并比较它们

SELECT id, tcpAddress, analog, discrete, counter, date
FROM xactions x1    
WHERE EXISTS (
              SELECT 1
              FROM xactions x2
              WHERE x1.tcpAddress = x2.tcpAddress
              HAVING MAX(x2.date) = x1.date
              ) AND (tcpAddress='192.168.1.161' OR tcpAddress='192.168.1.162')