【问题标题】:Constrain left join约束左连接
【发布时间】: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


【解决方案1】:

是这样吗?

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

【讨论】:

  • @FelR 你检查了吗?
  • 是的,已经试过了,但是没用。目前我正在使用一种解决方法:SELECT t1.* FROM (SELECT * FROM druckerdaten WHERE datum
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多