SQL Server 如何仅查询在数据库中多次出现的值

2wnc66cl  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(158)

我正在尝试对销售数据进行购物篮分析。为此,我需要两个值order_idproduct_id
我只需要order_idproduct_id,当它们在同一行中有重复值时,但是我不想去掉这些值,如果order_id和product_id在数据库中只显示一次,我想去掉它们。
从这个
| 订单标识|产品标识|
| - ------| - ------|
| 1个|1个|
| 1个|第二章|
| 1个|三个|
| 1个|四个|
| 第二章|1个|
| 第二章|第二章|
| 第二章|三个|
| 三个|1个|
| 三个|第二章|
| 三个|五个|
| 四个|第二章|
到这个
| 订单标识|产品标识|
| - ------| - ------|
| 1个|1个|
| 1个|第二章|
| 1个|三个|
| 第二章|1个|
| 第二章|第二章|
| 第二章|三个|
| 三个|1个|
| 三个|第二章|

SELECT order_id, product_id
FROM order_items
ORDER BY order_id
3ks5zfa0

3ks5zfa01#

我确信有一个更优雅的解决方案,但是如果我理解您的问题,即希望行的order_id或product_id在DB中出现不止一次,那么我相信这是可行的:

**EDIT:**如果您需要它们在列表中都有多个项目,那么我只需要将它们单独连接到一个子查询中,如下所示:

SELECT t1.order_id, t1.product_id
FROM order_items  t1
INNER JOIN (
        SELECT ORDER_ID from order_items  group by ORDER_ID having count(*) > 1) t2 
    ON t1.order_id = t2.order_id
INNER JOIN (
        SELECT PRODUCT_ID from order_items  group by PRODUCT_ID having count(*) > 1) t3 
    ON t1.product_id = t3.product_id
ORDER BY order_id
uxh89sit

uxh89sit2#

在这里,两个窗口聚合可能工作得最好™:

WITH CTE AS(
    SELECT order_id,
           product_id,
           COUNT(1) OVER (PARTITION BY order_id) AS orders,
           COUNT(1) OVER (PARTITION BY product_id) AS products
    FROM dbo.YourTable)
SELECT order_id,
       product_id
FROM CTE
WHERE orders > 1
  AND products > 1;
5w9g7ksd

5w9g7ksd3#

in关键字可以使查询更简单,但我不确定性能...

select order_id, product_id from order_items
where order_id not in (
  select order_id from order_items group by order_id having count(*) = 1
) and product_id not in (
  select product_id from order_items group by product_id having count(*) = 1
);

相关问题