我有一个SQL表,AT& T无线用户的使用时间超过几个月。我试图了解那些月份谁使用了最多的数据,但无线号码帐户上的一些用户名以及他们的数据计划已经改变。这是我正在尝试运行的查询:
select Wireless_Number, User_Name, sum(Total_KB_Data_Usage / 1048576) as Total_GB_Usage, avg(Total_KB_Data_Usage / 1048576) as AVG_GB_Usage, Data_Pooling_Rate_Plan_Code
from att
group by Wireless_Number
order by Total_GB_Usage desc
limit 20;
这是我回来的预览(隐私时省略了一些数据)
| Wireless_Number | User_Name | Total_GB_Usage | AVG_GB_Usage | Data_Pooling_Rate_Plan_Code |
|-----------------|------------------|----------------|--------------|-----------------------------|
| XXXXXX3330 | XXXX CRADLEPOINT | 1452.6883 | 181.58603750 | B
| XXXXXX4638 | XXXX CLARK | 392.4903 | 49.06128750 | B
| XXXXXX1819 | XXXX RAMSEY | 346.8210 | 43.35262500 | B
| XXXXXX0847 | XXXX WYNIA | 265.9175 | 33.23968750 | B
问题在于'Ramsey'不再是该账户的持有者,现在是'Welch'
select monthname(Month) as Month, Wireless_Number, User_Name
from att
where Wireless_Number like 'XXXXXX1819';
| Month | Wireless_Number | User_Name |
|----------|-----------------|-------------|
| October | XXXXXX1819 | XXXX RAMSEY |
| November | XXXXXX1819 | XXXX WELCH |
| December | XXXXXX1819 | XXXX WELCH |
| January | XXXXXX1819 | XXXX WELCH |
| February | XXXXXX1819 | XXXX WELCH |
1819年只是迄今为止发生变化的数字之一。我想在我的初始查询中选择使用分组的最后一行,但我仍然需要查询所有月份以获得准确的总和和平均值。我该怎么做呢?
编辑: Wireless_Number不会更改,只有User_Name和Data_Pooling_Rate_Plan_Code可能有。
| monthname(Month) | Wireless_Number | User_Name | Data_Pooling_Rate_Plan_Code |
|------------------|-----------------|-------------------|-----------------------------|
| October | XXXXXX3330 | XXXX CRADLEPOINT | B
| November | XXXXXX3330 | TEMP LTE INTERNET | BDP10GBO
| December | XXXXXX3330 | TEMP LTE INTERNET | None
这是关于改变计划,从3月开始持续。
| Month | Wireless_Number | User_Name | Data_Pooling_Rate_Plan_Code
|----------|-----------------|------------|---------------------|
| January | XXXXXX1819 | XXXX WELCH | BDPIPJ5GB |
| February | XXXXXX1819 | XXXX WELCH | Multiple Rate Plans |
| March | XXXXXX1819 | XXXX WELCH | MBSL5GWTO |
我不会不同意这些数据不好,但我觉得这是我应该做的事情。
编辑2: 我的主键是Wireless_Number。 以下是我希望从理想查询中看到的内容:
| Wireless_Number | User_Name | Total_GB_Usage | AVG_GB_Usage | Data_Pooling_Rate_Plan_Code |
|-----------------|-------------------|----------------|--------------|-----------------------------|
| XXXXXX3330 | TEMP LTE INTERNET | 1452.6883 | 181.5860375 | NONE
| XXXXXX4638 | XXXX CLARK | 392.4903 | 49.0612875 | MBSL5GWTO |
| XXXXXX1819 | XXXX WELCH | 346.821 | 43.352625 | MBSL5GWTO |
答案 0 :(得分:0)
一种解决方案是简单地扩展您的group by
子句以包含User_Name
。如果您在两个用户之间共享了行a
,则会为每个用户生成一条记录。
select
Wireless_Number
, User_Name
, Data_Pooling_Rate_Plan_Code
, sum(Total_KB_Data_Usage / 1048576) as Total_GB_Usage
, avg(Total_KB_Data_Usage / 1048576) as AVG_GB_Usage
from
att
group by
Wireless_Number
, User_Name
, Data_Pooling_Rate_Plan_Code
order by
Total_GB_Usage desc
limit 20;
您可能想要引入一些额外的逻辑,仅选择目前只有该号码的人。
答案 1 :(得分:0)
为了获得我想要的结果,我只是颠倒了整个数据库。我是这样做的
create table reversed
select *
from database
order by Month desc;
当我对这个数据库运行查询时,我得到了我想要的结果。我意识到这可能是不好的做法,但它确实有效。