2012-07-10 50 views
0

我目前有一个包含497k个单词的表。每个单词及其在英语中的相对频率是一排。我想创建另一个列,根据它们的频率从1到497k(此列表中的单词数)排序,最高频率为1,依此类推。我怎样才能做到这一点?我使用MySQL的54年5月1日根据另一列值的顺序对表中的所有行进行编号

+0

就可以开始编写一个查询,我们将帮助您解决问题和改进 – Ibu 2012-07-10 16:22:07

+0

这样做有什么目的时,你可以放置一个'ORDER BY'在您的检索报告中? – 2012-07-10 16:22:20

+0

-1简单计数(B),然后按顺序排列。 – 2012-07-10 16:23:08

回答

1

我想出这个(复杂的,但也许快)一个语句的解决方案:

update vocabulary SET rank = 

(
SELECT ranking.rank FROM (
    SELECT @rownum:[email protected] + 1 as rank, voca.word 
    FROM 
     (
     SELECT v.word, v.frequency 
     FROM vocabulary v 
     ORDER BY v.frequency DESC 
    ) voca, 
    (SELECT @rownum := 0) r 
) ranking 
WHERE ranking.word = vocabulary.word 
); 

我相信这可以进一步optimzed但它可能是一个很好的起点指出有一个单一的声明的解决方案。

此外,这可能仍然存在排名不同但词频相同的行。

这里是一个SQL捣鼓它: http://sqlfiddle.com/#!2/a00e2/1

+0

看起来很棒!我从来没有见过sqlfiddle。我会尽快尝试。 Ty – user1515381 2012-07-10 17:11:56

+0

很高兴为您效劳。 :) – 2012-07-10 17:17:31

+0

它没有工作:/。我忘了提到同一个词可以多次出现。数据库中的唯一条目由一个词和一个PoS标签组成。我在乱搞你的代码,但无法让它取出PoS标签。任何帮助? – user1515381 2012-07-10 19:16:34

相关问题