我在MySql 5中有一个电话号码表。简单的结构是
Accounts
id varchar(32) NOT NULL
记录如下
27100070000
27100070001
27100070002
27100070003
27100070004
27100070005
27100070008
27100070009
27100070012
27100070015
27100070016
27100070043
我需要对这些数据进行排序,并将连续的数字块分组为数字范围。我愿意在C#LINQ中实现该解决方案,但服务器端MySql是一等奖。MySql中是否有一种方法可以汇总此数据,以便输出如下所示?
Start | End
-------------------------
27100070000 | 27100070005
27100070008 | 27100070009
27100070012 | 27100070015
27100070016 | NULL
27100070043 | NULL
有一个简单的技巧可以将连续的条目折叠成一个组。如果按(row_number-entry)进行分组,则连续的条目将在同一组中结束。这是一个演示我的意思的示例:
查询 :
SELECT phonenum, @curRow := @curRow + 1 AS row_number, phonenum - @curRow
from phonenums p
join (SELECT @curRow := 0) r
结果 :
| PHONENUM | ROW_NUMBER | PHONENUM - @CURROW |
-------------------------------------------------
| 27100070000 | 1 | 27100069999 |
| 27100070001 | 2 | 27100069999 |
| 27100070002 | 3 | 27100069999 |
| 27100070003 | 4 | 27100069999 |
| 27100070004 | 5 | 27100069999 |
| 27100070005 | 6 | 27100069999 |
| 27100070008 | 7 | 27100070001 |
| 27100070009 | 8 | 27100070001 |
| 27100070012 | 9 | 27100070003 |
| 27100070015 | 10 | 27100070005 |
| 27100070016 | 11 | 27100070005 |
| 27100070040 | 12 | 27100070028 |
请注意,连续的条目如何都具有相同的值PHONENUM - @CURROW
。如果我们在该列上进行分组,然后选择每个组的最小值和最大值,那么您将获得摘要(一个例外:如果需要,可以将NULL
START = END
替换为END值):
查询 :
select min(phonenum), max(phonenum) from
(
SELECT phonenum, @curRow := @curRow + 1 AS row_number
from phonenums p
join (SELECT @curRow := 0) r
) p
group by phonenum - row_number
结果 :
| MIN(PHONENUM) | MAX(PHONENUM) |
---------------------------------
| 27100070000 | 27100070005 |
| 27100070008 | 27100070009 |
| 27100070012 | 27100070012 |
| 27100070015 | 27100070016 |
| 27100070040 | 27100070040 |
演示:http ://www.sqlfiddle.com/#!2/
59b04/5
问题内容: 我想看看如何只获得具有唯一城市的唯一行/记录,而不关心是否是首都,例如: 只会返回一条记录。 我累了像这样的东西,但是没用 谢谢… 问题答案: 您可以使用以下仅用于mysql的技巧: 这将返回 遇到的第一行 的每个独特的价值和。 其他数据库将抱怨您的分组依据中未列出未聚合的列或此类消息。 已编辑 以前我声称不使用分组列上的函数将返回所有大小写的变化,但这是不正确的- 感谢SalmanA
问题内容: 我已经搜索了此内容,但是所有类似的问题和答案都完全不同,无法正常工作。 我有一个包含以下字段的表格:人,事物,purdate。当某人购买每件新东西时,将输入一条新记录。 我想计算一个人连续购买了“事物”(thing01或thing02,没有关系)的月份。如果连续的休息日休息,则应重新开始计数。 封闭数据后,我想得出以下结论: 我知道我可以得到一个不同的人员列表,extract(purd
问题内容: 我在 sqlfiddle 上有结构表: 我想在本周获得记录,例如,如果现在是2013年11月21日,我希望将2013年11月18日至2013年11月24日的所有行(在星期中) 现在我看下一个算法: 获得工作日 计算多少天前是星期一 计算星期一的日期 计算周日的未来日期 要求日期 请告诉我,是否存在一个较短的算法(最好在查询MySQL中)? 添加的问题是: 为什么 此查询 选择日期记录,
问题内容: 我的数据具有日期(Ymd H:i:s)列(类型为datetime)。我想选择输入日期之前1周内的所有记录(在下面的示例中:2011-09-17 00:00:00,但是遇到了一些麻烦。这是我得到的: 我究竟做错了什么?谢谢 问题答案: 我想你错过在前面: 这是我运行的查询,适用于该零件: 您可以使用负值来执行“给定日期前N周”的查询,这样可以正常工作: 要么:
问题内容: 对于保存用户网页访问行为记录的表,如何选择访问多个网页的用户。 该表的结构为: 我可以使用以下方法计数: 它给我的结果是: 我该如何执行查询,使我得到最终结果,例如: 每个都是访问多个DISTINCT网页的用户 问题答案: 只需添加having子句 但是如果你只是 SQLFiddle演示 之所以筛选on子句而不是on的原因是因为,子句不能支持 聚集了的 列。
问题内容: 这个问题很简单,由于某种原因我无法获得正确的结果以仅显示重复记录 样本输出 预期产量 我如何做到这一点? 问题答案: sqlfiddle