【发布时间】:2017-10-23 03:08:37
【问题描述】:
我正在使用左连接来解决每个组的最大 n 问题。它适用于在基准列中按日期获取最新值。
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;
接下来我想在基准列中获取特定日期之前的最新值,但我不知道如何实现这一点。 也不是,例如。 datum
这是一个示例数据集:
----------------------------------------------------
|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 |
----------------------------------------------------
现在使用以下查询将基准列限制在 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 |
----------------------------------------------------
我怎样才能做到这一点?
【问题讨论】:
-
在我看来,将这种情况放在 where 应该可行。你能提供一个示例数据集和期望的结果,以及如何放置条件失败?
-
感谢您的帮助。我在我的问题中添加了一些示例数据
-
我遇到了类似的问题。我正在尝试限制左连接以仅显示具有特定日期的记录,但它不返回结果。你找到什么了吗?
标签: mysql left-join greatest-n-per-group