【问题标题】:Removing Duplicate Values within Group By删除 Group By 中的重复值
【发布时间】:2017-02-03 22:42:20
【问题描述】:

我在 Microsoft Visual Studio 2010 中使用 SQL-Server 2012。

作为前言,我不能使用 ROW_NUMBER() OVER(PARTITION BY Col),因为我使用的 Visual Studio 版本不支持 OVER() 方法。不幸的是,我不在一个可以获得新软件的地方。

我有一组部门和工作 ID,例如:

SELECT 
   Department, 
   Job_ID
FROM 
   Table1 
JOIN Table2 on 
Table1.id = Table2.id


Department       Job_ID
__________________________

 Marketing         J3
 Engineering       J1
 Marketing         J2
 Recruiting        J2
 Marketing         J8
 Administration    J3
 Recruiting        J1
 Administration    J5
 Administration    J1

我正在尝试按 Job_ID 进行分组,显示与每个 Job_ID 关联的不同部门,并​​且仅包括具有 2 个以上部门的组。最终结果将是:

Department       Job_ID
__________________________

 Administration    J1
 Recruiting        J1
 Engineering       J1
 Marketing         J2
 Recruiting        J2
 Marketing         J3
 Administration    J3

我试过了:

SELECT Job_ID, count(distinct(Department)) as Dept_CountD
FROM Table1 JOIN Table2 on Table1.id=Table2.id
GROUP BY Job_ID
HAVING count(distinct(Department)) >1

这可行,但是,它不会将部门与每个 ID 一起分组。我也知道(并且已经测试过)我不能将 Department 插入 Group By 语句,因为这将返回仅等于 1 的不同部门计数!

我已尝试将上述语句构建为 CTE 并在 Job_ID 上进行内部连接,因此我只有 Job_ID 与超过 2 个不同的部门相关联,但是,我最终在连接的分组中出现重复的部门。

我正在考虑加入子查询或进行半联接?

【问题讨论】:

  • 预期输出是什么?
  • “我不能使用“ROW_NUMBER() OVER(PARTITION BY)”是什么意思,因为我正在使用的 Visual Studio 版本不支持“OVER()”方法? SQL Server 的版本决定了哪些脚本可以工作,哪些不能,SQL Server 2012 支持OVER 子句。
  • 什么是“半连接”?
  • 预期的输出已经写入。它是“最终结果将是:”之后的第二个数据块
  • 半连接示例是:SELECT col1, col2 FROM table1 WHERE id IN (SELECT t1_id FROM table2 WHERE date > CURRENT_TIMESTAMP)

标签: sql-server visual-studio-2010 sql-server-2012


【解决方案1】:

这个怎么样:

SELECT 
   Department, 
   Job_ID
FROM Table1 
JOIN Table2 on Table1.id = Table2.id
WHERE Job_ID IN (SELECT Job_ID
                 FROM Table1 JOIN Table2 on Table1.id=Table2.id
                 GROUP BY Job_ID
                 HAVING count(distinct(Department)) >1)

【讨论】:

  • 是的@Tim,我们也可以使用JOIN
  • 我认为这就是我一直在寻找的东西(并且在我昨晚在键盘上敲了 2 个小时后放弃了这个问题后,我正在脑海中制定)。我通常被 CTE 宠坏了,对子查询的直觉很弱。
  • @Holmes 很高兴我能提供帮助。
【解决方案2】:

使用COUNT() Over()窗口聚合

select * from 
(
select count(1)over(partition by Job_ID) as cnt,*
From <<join>>
) A
Where cnt > 1

【讨论】:

    【解决方案3】:

    试试这个:(我只是猜测哪个表有部门,哪个有工作,因为你没有提供架构。

      SELECT Job_ID, count(*) Dept_CountD
      FROM Table1 a JOIN Table2 b on a.id=b.id
      where (Select count(*) from table1
             Where JobId = a.JobId) > 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多