首页 > 解决方案 > SQL选择包含间隔中所有值的行

问题描述

我知道这个问题措辞不好,对不起,我真的无法用语言表达这个问题。这是一个表示:

我有两个表:产品和可用性。一个产品可以有多个可用日期。例子:

Table 1 (products):
id     | name              | ....
----------------------------------
1      | My product 1      | ....
2      | My product 2      | ....


Table 2 (availability):
id     | productId         | date
-----------------------------------------
1      | 1                 | 2021-01-15
2      | 1                 | 2021-01-16
3      | 1                 | 2021-01-17
4      | 2                 | 2021-01-15
5      | 2                 | 2021-01-16

是否有一个 sql 语句,给定一个间隔,允许我们获取一个产品列表,该列表在间隔的每个元素的可用性表中有一行?

例如,给定区间 [2021-01-15 -> 2021-01-17],请求应返回产品 1,因为它在整个期间都可用(每个元素都有一行:第 15、16 和 17) . Product2 未返回,因为它在 2021-01-17 不可用。

有没有办法在 SQL 中做到这一点,还是我必须使用 PL/SQL?

任何帮助表示赞赏,谢谢

标签: sqldatabasepostgresqlentity-relationship-model

解决方案


您可以使用如下分析函数:

select p.* from
(select p.*, count(distinct a.date) over (partition by a.productid) as cnt
  from products p
  join availability a on a.productid = p.id
 where a.date >= date '201-01-15'
  and  a.date < date '201-01-17' + 1  )
where cnt = date '201-01-17' - date '201-01-15' + 1

推荐阅读