所以我现在拥有下面屏幕截图所示格式的数据。我需要做的最后一件事是获取这些数据,并在最后添加百分位列。百分位数很有价值,因为它会显示给定密码在整个数据集中的常见程度。
有没有人对生成该百分位列的SQL查询有个好主意?
我正在对我所在大学的研究论文的黑客“RockYou”密码进行一些分析。简而言之,RockYou是一项服务,允许用户创建个性化的MySpace小部件。该服务遭到黑客入侵,黑客通过洪流向公众发布了一个包含所有明文密码的巨大文本文件,没有任何用户信息。
我已将所有密码导入MySql,现在我有一个包含17004335密码记录的巨型表。我想改造数据,以便我可以快速获得任何提供的密码的百分位数以及密码在数据集中出现的次数。
以下是我当前的密码表:
password
password1
password2
password3
password1
password3
password3
我想将它变成一个简化的表,按出现次数递减排序。此外,我需要一些帮助,正确识别任何给定密码的百分位数。密码3 是否在100%百分位,密码1 在33%百分位?
password occurrences percentile
password3 3 ?
password1 2 ?
password2 1 ?
我将使用此数据制作一个工具,允许用户快速查看数据集中是否出现密码。百分位数越高,密码越不安全。显然,如果密码甚至在数据集中是一件坏事。 =]
非常感谢任何有关SQL查询的帮助以获得此数据的重组。
答案 0 :(得分:1)
这样的事情可能会帮助你开始:
select
password,
count(*) as freq,
if(t.total = 0, 0, (count(*)/t.total) * 100) as pct_freq
from
passwords
join (
select count(*) as total from passwords
) t
group by
password
order by
freq desc limit 100;
就个人而言,我会考虑在C#之外的MySQL之外做这件事。解析密码文件并使用像Dictionary / Hashtable这样的数据结构来计算数据......