按组 ID 使用 SQL 服务器过滤
Filter with SQL Server by Group ID
我有两个表,我需要根据过滤器 ID 来过滤数据,这取决于与过滤器组 ID 的关系。
例如我有这两个表:
Table 1:
ItemID
FilterID
3
122
3
123
3
4
17
123
Table 2:
FilterID
FilterGroupID
122
5
123
5
4
1
- 如果我按过滤器 ID = 123 进行搜索,那么所有具有此过滤器的项目 ID 都需要 returned。
- 如果我搜索两个或多个具有不同组 ID 的不同过滤器 ID,我只需要获取具有所有过滤器 ID 和组 ID 的项目 ID。
期望的输出:
- 第一个输入:123 -> return item id =3 and item id = 17
- second input: 123,4 -> return item id = 3 因为过滤器 id 123 属于 group id 5 而 filter id 4 属于 group id 1 而 item id 3 是唯一具有这两个过滤器。
- 第三个输入:122,123 -> return item id =3 和 item id = 17 因为两个过滤器 id 属于同一组。
我对这个查询有点迷茫,我很乐意得到一些帮助。
我会尽量简化它:假设我们有大小组过滤器和颜色组过滤器。如果我按尺码 S 或 M 过滤,则我需要获取所有具有该尺码的商品。如果我想添加蓝色之类的颜色,那么答案会将结果削减为:尺寸为 S 或 M 且颜色为蓝色的项目。所以来自不同组的过滤器可能会减少一些结果
您似乎想要从 each [=12] 中获取每个具有 至少一个 匹配过滤器的每个 ItemID
=] 在您的过滤器输入中。所以在每个组中你有 or
逻辑,在组之间你有 and
逻辑
如果您将输入存储在 table 变量或 Table 值参数中,那么您可以使用正常的关系除法技术。
这就变成了Relational Division With Remainder的问题,有多个除数。
切蛋糕的方法有很多种。这是一个选项
- 将过滤器输入加入组,得到每个过滤器的组ID
- 使用
DENSE_RANK
和 MAX
的组合来获得不同组的总数(你不能在 window 函数中使用 COUNT(DISTINCT
所以我们需要破解它)
- 您可以更改此步骤以使用子查询而不是 window 函数。它可能更快或更慢
- 加入主要 table,并过滤掉任何
ItemID
其不同组的总数与主要总数不同的
SELECT
t1.ItemID
FROM (
SELECT *,
TotalGroups = MAX(dr) OVER ()
FROM (
SELECT
fi.FilterID,
t2.FilterGroupID,
dr = DENSE_RANK() OVER (ORDER BY t2.FilterGroupID)
FROM @Filters fi
JOIN Table2 t2 ON t2.FilterID = fI.FilterID
) fi
) fi
JOIN Table1 t1 ON t1.FilterID = fi.FilterID
GROUP BY
t1.ItemID
HAVING COUNT(DISTINCT FilterGroupID) = MAX(fi.TotalGroups);
我有两个表,我需要根据过滤器 ID 来过滤数据,这取决于与过滤器组 ID 的关系。
例如我有这两个表:
Table 1:
ItemID | FilterID |
---|---|
3 | 122 |
3 | 123 |
3 | 4 |
17 | 123 |
Table 2:
FilterID | FilterGroupID |
---|---|
122 | 5 |
123 | 5 |
4 | 1 |
- 如果我按过滤器 ID = 123 进行搜索,那么所有具有此过滤器的项目 ID 都需要 returned。
- 如果我搜索两个或多个具有不同组 ID 的不同过滤器 ID,我只需要获取具有所有过滤器 ID 和组 ID 的项目 ID。
期望的输出:
- 第一个输入:123 -> return item id =3 and item id = 17
- second input: 123,4 -> return item id = 3 因为过滤器 id 123 属于 group id 5 而 filter id 4 属于 group id 1 而 item id 3 是唯一具有这两个过滤器。
- 第三个输入:122,123 -> return item id =3 和 item id = 17 因为两个过滤器 id 属于同一组。
我对这个查询有点迷茫,我很乐意得到一些帮助。
我会尽量简化它:假设我们有大小组过滤器和颜色组过滤器。如果我按尺码 S 或 M 过滤,则我需要获取所有具有该尺码的商品。如果我想添加蓝色之类的颜色,那么答案会将结果削减为:尺寸为 S 或 M 且颜色为蓝色的项目。所以来自不同组的过滤器可能会减少一些结果
您似乎想要从 each [=12] 中获取每个具有 至少一个 匹配过滤器的每个 ItemID
=] 在您的过滤器输入中。所以在每个组中你有 or
逻辑,在组之间你有 and
逻辑
如果您将输入存储在 table 变量或 Table 值参数中,那么您可以使用正常的关系除法技术。
这就变成了Relational Division With Remainder的问题,有多个除数。
切蛋糕的方法有很多种。这是一个选项
- 将过滤器输入加入组,得到每个过滤器的组ID
- 使用
DENSE_RANK
和MAX
的组合来获得不同组的总数(你不能在 window 函数中使用COUNT(DISTINCT
所以我们需要破解它)- 您可以更改此步骤以使用子查询而不是 window 函数。它可能更快或更慢
- 加入主要 table,并过滤掉任何
ItemID
其不同组的总数与主要总数不同的
SELECT
t1.ItemID
FROM (
SELECT *,
TotalGroups = MAX(dr) OVER ()
FROM (
SELECT
fi.FilterID,
t2.FilterGroupID,
dr = DENSE_RANK() OVER (ORDER BY t2.FilterGroupID)
FROM @Filters fi
JOIN Table2 t2 ON t2.FilterID = fI.FilterID
) fi
) fi
JOIN Table1 t1 ON t1.FilterID = fi.FilterID
GROUP BY
t1.ItemID
HAVING COUNT(DISTINCT FilterGroupID) = MAX(fi.TotalGroups);