【问题标题】:SQL to identify the IDs for which some columns are different with a filterSQL 来识别某些列与过滤器不同的 ID
【发布时间】:2021-12-16 12:11:13
【问题描述】:

假设我有一个下表:

   id | temp_id | status     | date
------+---------+------------+-----------
0  10 | 123-abc |   closed   | 2021-11-01
1  12 | 123-abc |   open     | 2021-10-26
2  14 | 123-abc |   null     |    null
3  15 | 123-abc |   open     | 2021-10-26
4  17 | 123-abc |   open     | 2021-10-26
5  20 | 456-xyz |   open     | 2021-10-29
6  22 | 456-xyz |   null     |    null
7  20 | 789-uvw |   closed   | 2021-10-06
8  22 | 789-uvw |   closed   | 2021-10-06

我想编写一个查询以从表中查找所有 temp_id,其中某些列(状态、日期)的值与相同的 temp_id 不匹配,并且至少其中一个的状态 = '已关闭'

对于这个表,它应该在 temp id 列中只返回 123-abc,如:

   | temp_id | 
---+---------+
0  | 123-abc | 

在这里,我不希望 456-xyz 作为结果出现,因为即使 id 20 和 22 具有相同的 temp_id 和不同的状态值,日期 - 但状态都没有“关闭”,因此最终结果不需要.而对于 789-uvw,两条记录(7 和 8)的状态为已关闭且日期也相同,因此也不需要。

到目前为止我的想法: 我正在使用由 temp_id 分区的 row_number,但在上面的示例中,如何比较 row_number 1 到 5 的 temp_id = '123-abc' 并查看其中是否有任何状态 = '已关闭'。我尝试了 any() 但它会引发错误,我想我没有正确使用它。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 样本数据很好,但您也应该使用相同的格式指定预期结果!
  • “一些列”不是很有帮助...
  • @jarlh - 我现在正在修复它
  • @andrew - 如果有帮助,我提供了更多详细信息。

标签: sql select ddl vertica


【解决方案1】:

使用HAVING 非常简单:

select
temp_id
from
<your table>
where temp_id in (select temp_id from <your table> where status = 'closed')
group by temp_id
having count (distinct status) > 1
or count (distinct date) > 1

DBFiddle

【讨论】:

  • 嗨,安德鲁 - 我试过了,语法是正确的,但它让我空白。另外,感谢您在这方面指导我。我让它比我想象的更复杂。
  • @trojanhorse - 我加了一个小提琴。使用您的示例数据,它会返回您想要的结果。
  • 谢谢,安德鲁。我明白了,它有效。我在有多个过滤器的本地数据上尝试了同样的方法。我也使用 CTE 完成了它,而且效果也很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多