MySQL组通过从最新条目获取数据

时间:2017-07-07 15:20:47

标签: mysql

我有一个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                   |

2 个答案:

答案 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;

当我对这个数据库运行查询时,我得到了我想要的结果。我意识到这可能是不好的做法,但它确实有效。