约束左连接

时间:2017-05-23 08:54:37

标签: mysql left-join greatest-n-per-group

我正在使用左连接来解决每组最大的问题。它适用于在基准列中按日期获取最新值。

SELECT t1.* FROM druckerdaten.druckerdaten AS t1 
LEFT OUTER JOIN druckerdaten.druckerdaten AS t2 
ON t1.ip = t2.ip AND (t1.datum < t2.datum OR (t1.datum = t2.datum AND t1.nr < t2.nr)) 
WHERE t2.ip IS NULL ORDER BY t1.ip;

接下来我想在基准列中的特定日期之前获取最新值,但我不知道如何实现这一点。 不是,例如。数据&lt;&#39; 2017-05-22 10:00:00&#39;在WHERE子句中,在ON子句中也可以工作。

以下是一个示例数据集:

----------------------------------------------------
|nr   |datum               |ip          |value     |
----------------------------------------------------
|1    |2017-05-01 15:00:00 |192.168.0.1 |a         |
|2    |2017-05-01 16:00:00 |192.168.0.2 |b         |
|3    |2017-05-01 17:00:00 |192.168.0.1 |c         |
|4    |2017-05-02 15:00:00 |192.168.0.2 |d         |
|5    |2017-05-02 16:00:00 |192.168.0.2 |e         |
----------------------------------------------------

以上查询的结果是:

----------------------------------------------------
|nr   |datum               |ip          |value     |
----------------------------------------------------
|3    |2017-05-01 17:00:00 |192.168.0.1 |c         |
|5    |2017-05-02 16:00:00 |192.168.0.2 |e         |
----------------------------------------------------

现在,使用以下查询将datum列约束在where子句中:

SELECT t1.* FROM druckerdaten.druckerdaten AS t1 
LEFT OUTER JOIN druckerdaten.druckerdaten AS t2 
ON t1.ip = t2.ip AND (t1.datum < t2.datum OR (t1.datum = t2.datum AND t1.nr < t2.nr)) 
WHERE t2.ip IS NULL AND datum<'2017-05-02 00:00:00' ORDER BY t1.ip;

这给了我这个结果:

----------------------------------------------------
|nr   |datum               |ip          |value     |
----------------------------------------------------
|3    |2017-05-01 17:00:00 |192.168.0.1 |c         |
----------------------------------------------------

但它应该给:

----------------------------------------------------
|nr   |datum               |ip          |value     |
----------------------------------------------------
|2    |2017-05-01 16:00:00 |192.168.0.2 |b         |
|3    |2017-05-01 17:00:00 |192.168.0.1 |c         |
----------------------------------------------------

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

是这样吗?

SELECT t1.* FROM druckerdaten AS t1 
LEFT OUTER JOIN druckerdaten AS t2 
ON t1.ip != t2.ip 
WHERE t1.datum < '2017-05-02 00:00:00' AND t2.datum < '2017-05-02 00:00:00' 
AND t1.nr >= t2.nr
group by t2.ip
ORDER BY t1.nr ASC;

SQL FIDDLE