MySQL group by从最新条目获取数据

MySQL group by从最新条目获取数据,mysql,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_Pla

我有一个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;
这里是我得到的预览(出于隐私考虑省略了一些数据)

问题是“拉姆齐”不再是该账户的持有人,现在是“韦尔奇”

select monthname(Month) as Month, Wireless_Number, User_Name
from att
where Wireless_Number like 'XXXXXX1819';
:

1819只是迄今为止发生变化的数字之一。我想选择初始查询中使用group by的最后一行,但我仍然需要查询所有月份,以获得准确的总和和平均值。我该怎么做呢

编辑: 无线号码不会更改,只有用户名和数据池率计划代码可能会更改

| 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 | 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                   |

一种解决方案是简单地扩展
GROUPBY
子句以包含
用户名
。如果有两个用户共享的行
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;

您可能需要引入一些额外的逻辑,以仅选择当前只有该号码的人。

为了得到我想要的结果,我刚刚颠倒了我的整个数据库。我是这样做的

create table reversed
select * 
from database
order by Month desc;

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

当然,您的数据中有实际的帐号和行号,可以在电话号码之外引用?表中的顺序不能保证。我们需要一种方法来将数据排序到某个日期或ID,这表示时间或序列的流逝。您是否有日期字段或某些ID(总是递增)?(请注意,月份不够好,因为您可能会有多年的月份).@Jacobm001,很遗憾,@xQbert我有一个月列格式为日期。单是月份还不足以解决这个问题;您需要一个完整日期或一个始终递增的ID。“月”是包含年的真实日期吗?我已经尝试过了,但没有任何附加语句。我看到的唯一问题是“XXXX支架点”在11月份改为“临时LTE”,因此我仍然希望在同一无线电话号码下包含该支架点的使用情况。不过,谢谢您的帮助。@TheDetect:在建议回答后添加其他信息总是很有帮助的。@TheDetect:如果电话号码和帐户名都可以在没有帐户号码的情况下随机更改,则实际上无法实现您的目的。数据太差了。@草莓:什么?@草莓:哦,说得好。我完全忽略了它的存在。我把它加入了这个小组,因为整件事似乎无关紧要。
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;
create table reversed
select * 
from database
order by Month desc;