SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件
Posted
技术标签:
【中文标题】SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件【英文标题】:SQL: Set conditional value based on another table, with a BETWEEN date criteria 【发布时间】:2020-06-17 21:01:15 【问题描述】:对 SQL 有点陌生,在网上做了一些搜索,但找不到答案。
SQL 数据库是 Snowflake 数据库,我相信它是 ANSI 数据库。
我有一个如下所述的事实表。相同问题/UPC/仓库/日期的组合是可能的,因为每当报告新问题时都会添加新记录。
排除列是我想要弄清楚的——如果问题/UPC/仓库和日期的组合在排除表中,它应该是“Y”,如下所示。
棘手的部分是数据是在个别日期级别,但如果它在范围内,我想排除它。
因此,此处仅应排除 I-100/1234/China/5-5-2019 和 I-324/1349/NewYork/6-1-2019,因为它们与排除表中的值和日期范围相匹配。
我尝试了以下查询,但 DATES BETWEEN 的 SELECT 返回了超过 1 条记录,并给了我这个错误Single-row subquery returns more than one row.
update "FactDetails"
set "EXCLUDE" = 'Y'
where ("UPC","Warehouse", "Issue") in
("UPC","Warehouse", "Issue" from "Exclusions"
where "PLANT_NUMBER" is not null
and "ISSUE_CODE" is not null)
and "Date" between
(select "DATE_FROM" from "Exclusion"
where "PLANT_NUMBER" is not null
and "ISSUE_CODE" is not null) and
(select "DATE_TO" from "Exclusion"
where "PLANT_NUMBER" is not null
and "ISSUE_CODE" is not null);
另一个复杂性是,排除表可以通过 UPC/问题/仓库的组合排除“级别”。仓库是最具体的,如果只是 UPC,它涵盖的数据最多。
【问题讨论】:
用您正在使用的数据库标记您的问题。 【参考方案1】:如果我理解正确,你可以使用exists
:
update t
set exclude = 'Y'
where exists (select 1
from exclusions e
where e.issue_code = t.issue_code and
e.upc = t.upc and
e.warehouse = t.warehouse and
t.date between e.date_from and e.date_to
);
【讨论】:
谢谢您——您能帮我解决这个小复杂问题吗?排除表可用于 3 个级别,按 UPC/问题/仓库、UPC/问题或 UPC 排除。例如:如果级别为 UPC,则应在该日期范围内排除该 UPC 的所有记录,并且“排除”表中的“发货和仓库”为空。我在主帖中提供了一张图片。我相信我不能只是一个接一个地做三个层次结构,因为一些不应该的数据会被排除。 @xii 。 . .这回答了您在这里提出的问题。您应该提出一个新问题,其中包含对排除表的更完整描述以及适当的样本数据和所需结果。如果您在此处更改问题,您将使此答案无效,这可能会导致投反对票。 刚刚发布的问题,链接在这里***.com/questions/62442059/…以上是关于SQL:基于另一个表设置条件值,具有 BETWEEN 日期条件的主要内容,如果未能解决你的问题,请参考以下文章
如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回