【问题标题】:SQL server,find distinct groups in a tableSQL Server,在表中查找不同的组
【发布时间】:2023-03-24 09:30:01
【问题描述】:

我有桌子

prdID    item     percentage
1        10         50
1        20         50
2        10         50
2        20         50
3        20         30
3        20         70
4        10         50
4        20         30
4        30         20
5        10         50
5        20         50

我想获取不同的组。基本上 结果集应该是

group   item     percentage
1        10        50
1        20        50
3        20        30
3        20        70
4        10        50
4        20        30
4        30        20

25 从结果中排除,因为它们包含与 1 完全相同的 item/percentage

【问题讨论】:

  • 区别于什么集合?为什么在结果集中表示组 1、3 和 4 而不是 2 和 5?
  • 基本上产品 1,2,5 具有相同的成分。所以它们是重复的。所以我只需要 prd 1
  • 为什么产品 1 被退回,为什么不是 2 或 5?是否有某种您想要强加的顺序来决定返回哪些重复组?此外,我们需要知道您使用的是哪个数据库引擎,因为任何答案都可能使用特定于引擎的 SQL 功能。
  • 这是一种关系除法查询。

标签: sql group-by distinct relational-division


【解决方案1】:
select * 
from table_name t
inner join (
select min(prdID) as prdID
from
(
SELECT 
  table_name.prdID as prdID,
  STUFF((
    SELECT ',' + cast(item as varchar)+'~'+cast(percentage as varchar)
    FROM table_name t2
    WHERE t2.prdID = table_name.prdID
    FOR XML PATH (''))
,1,2,'') AS Names
FROM table_name
GROUP BY table_name.prdID
)t
group by Names)R
on t.prdID=R.prdID

SQL FIDDLE

【讨论】:

    【解决方案2】:

    我认为这是您想要的查询:

    SELECT MIN(prdId) AS group, item, percentage
    FROM <tablename>
    GROUP BY item, percentage
    

    这将对您的示例数据产生以下结果:

    group   item     percentage
    1        10        50
    1        20        50
    3        20        30
    3        20        70
    4        30        20
    

    (我认为您在示例输出中犯了一个小错误,包括另外两个 4。它们的(项目、百分比)值是第 1 组和第 3 组的重复值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多