sql - 有没有更好的方法来过滤每个组中存在的数据?

标签 sql sql-server group-by having-clause

我正在尝试找出如何从 SQL Server 过滤数据集。

DECLARE @OUTPUT AS TABLE (FILTER INT,PART INT,LOT INT)
INSERT INTO @OUTPUT (FILTER,PART,LOT) VALUES
(1,1377882157,1379436702),
(1,1377882157,1382038239),
(1,1377882157,1382038531),
(3,1373463498,1380792160),
(3,1377882157,1379436702),
(4,1373638746,1382475541),
(4,1377882157,1379436702),
(5,1373463498,1380792160),
(5,1373463959,1380792272),
(5,1373464034,1380791899),
(5,1373638746,1379326622),
(5,1373638746,1382475541),
(5,1373638756,1383222295),
(5,1377882157,1379436702),
(5,1377882157,1382038239),
(5,1377882157,1382038531),
(5,1377882159,1383658054),
(8,1373638746,1379326622),
(8,1377882157,1379436702)

我正在寻找每个过滤器组中存在的零件和批处理。过滤器组是根据用户选择动态生成的。

提供的数据只会返回 1 项(例如 1377882157,1379436702),因为它是所有过滤器组中唯一存在的一项。

这就是我现在所拥有的......想知道是否有更好的方法来做到这一点?

DECLARE @FILTER_CNT INT
SET @FILTER_CNT = 5

SELECT
    F_PART,
    F_LOT
FROM @FILTERED_LOTS
GROUP BY F_PART,F_LOT
HAVING COUNT(FILTER) = @FILTER_CNT

我正在考虑一种不必定义 FILTER_CNT 的方法。

最佳答案

您可以将@FILTER_CNT替换为子查询

SELECT PART, LOT
  FROM output
 GROUP BY PART, LOT
HAVING COUNT(FILTER) = 
(
  SELECT COUNT(DISTINCT FILTER) 
    FROM output
)

输出:

|       PART |        LOT |
|------------|------------|
| 1377882157 | 1379436702 |

这里是SQLFiddle 演示

关于sql - 有没有更好的方法来过滤每个组中存在的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19851714/

相关文章:

mysql - 表中的订单 ID

SQL 查询计算行与前一行的总和

sql - 如何自动将数据发送到excel

mysql - 将SQL查询结果插入Excel

sql - 从分组重复项中选择具有更新日期的记录的最佳方法

mysql - 索引 MySQL 列可以改进 LIKE 搜索吗?

mysql - 使用 group by 计算行数并显示所有行 MYSQL PHP

python - 按 pandas 数据框分组的平均值

group-by - 连接 pig 的每个字段?

mysql - 错误代码 : 1215. 无法添加外键约束