【问题标题】:Select only those values that are not contained by another line entirely仅选择那些不完全包含在另一行中的值
【发布时间】:2022-11-26 14:35:05
【问题描述】:

我有一张桌子

user_id thing_id start end
1 1 2022-01-01 2022-01-31
1 2 2022-01-05 2022-01-10
1 3 2022-02-01 2022-02-05
2 4 2022-01-01 2022-01-01
2 5 2022-01-02 2022-01-04

我想选择所有的东西,但跳过那些完全包含在同一用户的另一件事中的东西。所以结果应该是

thing_id
1
3
4
5

我假设我需要使用窗口函数和条件,但不知道如何有效地查询它。

【问题讨论】:

  • 如果同一用户有 2 行,而不同的事物具有相同的日期怎么办?
  • 好点子!我认为就我的目的而言,如果有多个相同的东西则无关紧要

标签: sql snowflake-cloud-data-platform exists


【解决方案1】:

您可以使用NOT EXISTS

对于您的示例数据,它会很简单:

SELECT t1.*
FROM tablename t1
WHERE NOT EXISTS (
  SELECT *
  FROM tablename t2
  WHERE t2.user_id = t1.user_id
    AND t2.thing_id <> t1.thing_id
    AND t1.start > t2.start AND t1.end < t2.end
);

请参阅demo

根据您的要求,您可以将日期条件更改为:

AND t1.start >= t2.start AND t1.end =< t2.end

或者:

AND ((t1.start >= t2.start AND t1.end < t2.end) OR (t1.start > t2.start AND t1.end <= t2.end))

【讨论】:

  • 谢谢你 - 我不知道使用这样的存在是可能的。做了一些测试,这就像我想要的那样工作!
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多