【问题标题】:SQL query with having function to only includes parts of another column?具有仅包含另一列的部分功能的 SQL 查询?
【发布时间】:2020-08-23 19:23:42
【问题描述】:

我正在尝试查找包含仅饮料商品的 fact_order_id。这将使 fact_order_id 不包括任何食品。

fact_order_id
fact_order_line_id
category Group
category Name

我在下面使用了 2 个单独的 SQL 查询。当我回去检查我的工作时,我注意到输出中的一些 fact_order_id 的 不是 仅限饮料订单。以下是 2 个独立的 SQL 查询,它们给我相同的输出:

select fact_order_id
from my_table
group by fact_order_id
having avg((category_group like 'Beverage%')::int) = 1;


select fact_order_id
from my_table
group by fact_order_id
having avg(CASE WHEN category_group like 'Beverage%' THEN 1 ELSE 0 END)=1;

上面的两个输出都给了我相同的行数。每当我交叉检查 fact_order_id 时,其中一些会包含带有食物的输出。

这个 fact_order_id 不应包含在我的输出中,因为订单上还有其他非饮料项目。有 2 个类别组具有饮料名称(饮料(非酒精)和饮料(专业))。有没有更好的方法来创建 SQL 查询以仅输出 fact_order_id 的饮料订单?

我使用的是 PostgreSQL 版本:08.00.0002

【问题讨论】:

标签: sql postgresql unique where-clause having


【解决方案1】:

根据你的 PostgreSQL 的年龄,你能试试这个吗?

select fact_order_id
  from my_table
 group by fact_order_id
having bool_and((category_group like 'Beverage%'));

根据您的评论,您能否尝试此查询并分享您的结果?

select fact_order_id, category_group, category_name,
       (category_group like 'Beverage%') as is_beverage
  from my_table
 where fact_order_id = '1 292 757'

您可以在检查时重新加入您的表格,看看是否有问题。从 SQL 的角度来看,以下查询是无意义的,但它会自动进行交叉检查:

with bev_orders as (
  select fact_order_id
    from my_table
   group by fact_order_id
  having bool_and((category_group like 'Beverage%'))
)
select *
  from my_table t
  join bev_orders b 
    on b.fact_order_id = t.fact_order_id
 where t.category_group not like 'Beverage%' ;

【讨论】:

  • 我仍然得到与上面列出的查询相同的行计数输出。我会接受这个答案,因为这个查询使用的函数 (bool_and) 与我之前尝试过的任何函数不同。
  • @Natasha 我不明白这将如何导致您的示例 fact_order_id 被返回。如果它不适合您,您无需接受此答案。我已经用一个查询更新了我的答案,这可能有助于我们找出问题所在。
  • 真/假对每个类别组有效。我不希望这个fact_order_id 返回主SQL 查询,因为fact_order_id 中至少有一个错误。交叉检查时,我还没有在包含食物的输出中找到fact_order_id
  • @Natasha 我在答案中添加了一个检查查询。
  • “No Rows To Show”作为输出是否意味着原始查询是正确的?
【解决方案2】:

排除你知道不好的fact_order_ids怎么样?

select distinct fact_order_id
from my_table
where fact_order_id not in (
    select distinct fact_order_id
    from my_table
    where not category_group like 'Beverage%'
);

【讨论】:

  • 我的输出有数千行,因此排除 fact_order_id's 将不起作用,除非我分别检查每个 fact_order_id。
  • 你误会了。我建议一个查询,该查询的工作原理是找到您要查找的内容的倒数,fact_order_ids 确实有一个非饮料项目,然后返回所有不在第一个集合中的 fact_order_ids。
  • 我得到与上面列出的查询相同的行计数输出。我正在交叉检查 my_table 中您显示的输出 fact_order_ids。
猜你喜欢
  • 2020-12-11
  • 2021-10-24
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
相关资源
最近更新 更多