T-SQL 如何配置分组依据以便正确显示特定值

T-SQL How to configure Group by so that specific values would be correctly shown

我当前的 T-SQL 查询提供了以下结果:

查询:

WITH CTE AS
(
SELECT SubscriberID, sum(valueMB) as ValuesMB
FROM dbo.InternetNetwork
GROUP BY SubscriberID
),
CTE2 AS (
SELECT ab.planID, a.SubscriberID, MAX(ValuesMB) as MaximumValue
FROM CTE AS a
left join 
Subscriber as ab on a.SubscriberID= ab.SubscriberID
GROUP BY ab.planID, a.SubscriberID
)
select *
FROM CTE2 as b
ORDER BY b.MaximumValue desc

输出:

planID | SubscriberID | MaxValue
19           1555       97536.00
18           3528       97478.00
2            4029       93413.00

查询#2:

WITH CTE AS
(
SELECT SubscriberID, sum(valueMB) as ValuesMB
FROM dbo.InternetNetwork
GROUP BY SubscriberID
),
CTE2 AS(
SELECT ab.planID, MAX(ValuesMB) as MaximumValue
FROM CTE AS a
left join 
Subscriber as ab on a.SubscriberID= ab.SubscriberID
GROUP BY ab.planID
)
SELECT pl.OperatorID, MAX(b.MaximumValue) as Super
FROM CTE2 as b
left join
Plan as pl on b.planID= pl.planID
GROUP BY pl.operatorID
ORDER BY pl.operatorID

输出#2:

OperatorID | Value
1            93413.00
2            86017.00
3            97536.00

我还想包括一个 subscriberID,但我想不出这样做的方法,因为唯一的方法是在最后一个 SELECT 中包括并添加到 GROUP BY,完成后,结果会变得一团糟,结果不准确。

我想要的输出:

 OperatorID | Value     | SubscriberID
    1         93413.00    4029
    2         86017.00    164
    3         97536.00    1544

internet网络数据:

SubscriberID    ValuesMB
1               28
1               27
2               27
2               27
2               27
3               29
3               28
3               27
3               27
4               27
4               27
4               29

订户数据:

SubscriberID    PersonID    PlanID
1               1           3
2               2           10
3               2           6
4               3           14
5               3           1
6               4           18
7               5           5
8               5           1
9               5           9
10              5           16
11              6           13
12              6           13
13              6           20
14              6           16
15              7           4

计划数据

PlanID  OperatorID
1       1
2       1
3       2
4       2
5       2
6       2
7       2
8       2
9       2
10      2
11      2
12      3
13      3
14      3
15      3
16      3
17      3
18      3
19      3
20      3

表格有点像这个相关的 InternetNetwork-> Subscriber -> Plan。 InternetNetwork 包含每个订阅者使用了多少。每个订阅者都有与其关联的计划。每个 Plan 包含不同的 Operator,只有三个。我想列出所有三个运营商,以及具有运营商和订阅者 ID 的计划订阅者传输的数据。

Window 函数允许您在 select 中包含字段以及聚合函数。你可以这样做

;WITH CTE AS
(
  SELECT I.SubscriberID, 
         S.PlanID,
         SUM(ValuesMB) OVER(PARTITION BY i.SubscriberID)as ValuesMB
  FROM dbo.InternetNetwork I
  JOIN Subscriber S
      ON I.SubscriberID = S.SubscriberID
),
CTE2 AS
(
  SELECT p.operatorID,
         a.SubscriberID,     
         a.ValuesMB,
         ROW_NUMBER() OVER(PARTITION BY p.operatorID ORDER BY a.ValuesMB DESC) as rn
  FROM CTE a
  join [Plan] P
    on a.planID = P.planID
)
SELECT operatorID,
       ValuesMB,
       SubscriberID
FROM CTE2
where rn = 1