【问题标题】:Select for items meeting both of two criteria in SQL选择同时满足 SQL 中两个条件的项目
【发布时间】:2013-01-29 17:39:53
【问题描述】:

我有一个系统可以将字段中项目的 XYZ 位置报告给 SQL 数据库。我试图通过过滤已知的时间点来过滤误报(仅识别移动的项目),当项目通过一个点时,以及项目在通过一个点后应该在什么位置。

我的逻辑是,如果一个项目在一个位置和时间并且在另一个位置和时间,它一定已经移动了。

所以我有这个查询:

SELECT tag_ID, X_location*3.28, Y_location*3.28, locate_time
FROM tag_blink_history
WHERE 
     (LOCATE_TIME > '2013-01-29 11:05:51' 
     AND LOCATE_TIME < '2013-01-29 11:06:56' 
     AND ((y_location*3.28 > 61) 
     AND (y_location*3.28 < 67.5)) 
     AND ((x_location*3.28 > 14.5) 
     AND (x_location*3.28 < 17.5)))
     AND (((y_location*3.28 > 70) 
     AND (y_location*3.28 < 75)) 
     AND locate_time < '2013-01-29 11:06:50' )
ORDER BY tag_id DESC

有什么想法吗?我意识到我用上述查询向 SQL 提出的要求是同时在两个地方(这不可能发生),但我想要的是同时存在于这两个空间约束中的记录——我想要它们同时存在的记录,而不是要求同时在两者中的记录。

【问题讨论】:

  • 我可以帮助你,但首先,你怎么知道你在查询的第二部分找到的项目与第一部分中的项目相同?您怎么知道要查询的时间/地点?
  • 您使用的是哪个 DBMS?甲骨文?波斯格雷斯?
  • 我有一个物理传感器,可以检测物品的存在和离开空间中的一条线。这就是我用来建立已知物理位置的方法。我正在使用 SQL YOG 来执行此操作

标签: sql data-processing sqlyog


【解决方案1】:

我认为您需要自行加入 - 您当前的查询永远不会产生任何结果。

尝试这样的方法来获取在您的 WHERE Critera 中多次出现的标签 - 但是,您是否缺少第二个位置的某些条件?这个例子使用你上面的例子:

SELECT DISTINCT t.tag_ID
FROM tag_blink_history t
   JOIN tag_blink_history t2 ON t.tag_ID = t2.tag_ID AND (t.x_location <> t2.x_location OR t.y_location <> t2.y_location)
WHERE (t.LOCATE_TIME > '2013-01-29 11:05:51' 
      AND t.LOCATE_TIME < '2013-01-29 11:06:56' 
      AND ((t.y_location*3.28 > 61) AND (t.y_location*3.28 < 67.5)) 
      AND ((t.x_location*3.28 > 14.5) AND (t.x_location*3.28 < 17.5)))
      AND (((t2.y_location*3.28 > 70) AND (t2.y_location*3.28 < 75)) 
      AND t2.locate_time < '2013-01-29 11:06:50' )
ORDER BY t.tag_id DESC

祝你好运。

【讨论】:

  • 谢谢,试试这个。 @sgeddes
  • 对于第二个位置,我在想它们是否位于项目进入范围之前的某个时间(我有一个检测存在和离开字段的线传感器光束)&& 在该区域之前它是一个有效的标准。
  • 我收到了 22 个标签,这是我所期望的。谢谢。
【解决方案2】:

您可以使用聚合(几种方法之一):

SELECT tag_ID, min(X_location*3.28), max(X_location*3.28), min(Y_location*3.28), max(Y_location*3.28), min(locate_time), max(locate_time)
FROM tag_blink_history
WHERE 
     (LOCATE_TIME > '2013-01-29 11:05:51' 
     AND LOCATE_TIME < '2013-01-29 11:06:56' 
     AND ((y_location*3.28 > 61) 
     AND (y_location*3.28 < 67.5)) 
     AND ((x_location*3.28 > 14.5) 
     AND (x_location*3.28 < 17.5)))
     AND (((y_location*3.28 > 70) 
     AND (y_location*3.28 < 75)) 
     AND locate_time < '2013-01-29 11:06:50' )
GROUP BY
   tag_ID
HAVING
   (min(X_location) <> max(X_location))
   OR
   (min(Y_location) <> max(Y_location))
ORDER BY tag_id DESC

@sgeddes 上面的自加入方法也不错;您还可以查看派生表。

【讨论】:

  • 我认为这是一条正确的道路,但我认为我需要两个“有”绑定框来选择仅移动标签? (按原样执行上面的查询不会产生任何结果,输入最小和最大范围也不会产生结果)我只是不确定操作聚合的概念乍一看使用的是什么,但会研究它。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2022-11-23
  • 2014-10-10
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多