繁体   English   中英

查找与 1 个非唯一列关联的列的唯一组合

[英]Finding unique combination of columns associated with 1 non-unique column

这是我的桌子:

物品编号 项目名 项目批次 追踪号码
一个 1 498239
一个 1 498239
一个 1 958103
b 2 123444
b 2 123444

我正在尝试查找具有非唯一 TrackingNumber 的 ItemID + ItemName + ItemBatch 的出现。 因此,在上面的示例中,出现 3 次a bag 1并且这些行中至少有 1 行的 TrackingNumber 与任何其他行不同。 在这种情况下, 958103498239不同,所以它应该是成功的。

对于b paper 2 ,TrackingNumber 对于所有相应的行都是唯一的,因此我们忽略了这一点。 是否有一个查询可以提取具有 3 个相同字段和 1 个非唯一字段的列组合?

还有一个选择:

SELECT * 
FROM tab
WHERE ItemBatch IN (SELECT ItemBatch 
                    FROM tab 
                    GROUP BY ItemBatch, TrackingNumber
                    HAVING COUNT(TrackingNumber) = 1)

此查询查找仅出现一次的(ItemBatch, TrackingNumber)组合,然后获取与其ItemBatch值对应的所有行。

在这里试试。

您可以使用GROUP BYHAVING

SELECT
  t.ItemID,
  t.ItemName,
  t.ItemBatch,
  COUNT(*)
FROM YourTable t
GROUP BY
  t.ItemID,
  t.ItemName,
  t.ItemBatch
HAVING COUNT(DISTINCT TrackingNumber) > 1;

或者,如果您想要每一行,您可以使用窗口函数。 您不能在窗口函数中使用COUNT(DISTINCT ,但可以使用DENSE_RANKMAX模拟它

SELECT
  t.*
FROM (
    SELECT *,
      Count = MAX(dr) OVER (PARTITION BY t.ItemID, t.ItemName, t.ItemBatch)
    FROM (
        SELECT *,
          dr = DENSE_RANK() OVER (PARTITION BY t.ItemID, t.ItemName, t.ItemBatch ORDER BY t.TrackingNumber)
        FROM YourTable t
    ) t
    
) t
WHERE t.Count > 1;

db<>小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM