如何选择顶级组然后取消组合

时间:2018-04-15 12:04:37

标签: sql-server ssms

我有这张桌子

+-------+----------+------+
| Group | Function | Name |
+-------+----------+------+
| G1    | F1       | ABC  |
| G1    | F1       | ABC  |
| G1    | F2       | ABC  |
| G1    | F3       | ABC  |
| G2    | F1       | XYZ  |
| G2    | F2       | XYZ  |
| G2    | F3       | XYZ  |
| G2    | F4       | XYZ  |
| G3    | F1       | LMN  |
| G3    | F2       | LMN  |
| G3    | F2       | LMN  |
| G3    | F2       | LMN  |
| G4    | F1       | QRX  |
| G4    | F2       | QRX  |
| G4    | F3       | QRX  |
| G4    | F4       | QRX  |
| G4    | F5       | QRX  |
+-------+----------+------+

所以

  • G1有3个不同的功能
  • G2有4个不同的功能
  • G3有2个不同的功能
  • G4有5个不同的功能

我想采用具有最高数量的G4和G2不同功能的前2组,然后将它们取消组合以获得如下输出:

+-------+----------+------+
| Group | Function | Name |
+-------+----------+------+
| G2    | F1       | XYZ  |
| G2    | F2       | XYZ  |
| G2    | F3       | XYZ  |
| G2    | F4       | XYZ  |
| G4    | F1       | QRX  |
| G4    | F2       | QRX  |
| G4    | F3       | QRX  |
| G4    | F4       | QRX  |
| G4    | F5       | QRX  |
+-------+----------+------+

尝试:

select * 
from mytable
where [Group] in
 (
   SELECT [Group]
   FROM mytable
   group by [Group]

 )

1 个答案:

答案 0 :(得分:2)

你的尝试沿着正确的方向发展。

您可以使用

SELECT *
FROM   mytable
WHERE  [Group] IN (SELECT TOP 2 WITH TIES [Group]
                   FROM   mytable
                   GROUP  BY [Group]
                   ORDER  BY COUNT(DISTINCT [Function]) DESC)

TOP 2 WITH TIES表示如果多个组使用相同的不同功能计数绑定,则最终可能会有两个以上的组。

如果您不想要,请删除WITH TIES,并且只需要删除任意绑定的{2}。