You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定数据表的SQL查询需求:单词统计相关问题

嘿,我来帮你搞定这几个基于给定表结构的SQL查询需求~ 每个需求我都写了对应的语句,还加了点说明方便你理解:

1. 统计所有书籍中仅出现一次的唯一单词总数

这里的核心是先算出每个单词在所有书籍里的总出现次数,再筛选出总次数恰好为1的单词,最后统计这些单词的数量:

-- 方式1:关联单词表确保统计的是有效单词
SELECT COUNT(w.id) AS unique_words_once_total
FROM m-words w
INNER JOIN (
    SELECT wordid
    FROM m-wordscounts
    GROUP BY wordid
    HAVING SUM(count) = 1
) wc ON w.id = wc.wordid;

-- 方式2:更简洁的统计(如果确认所有wordid都对应有效单词)
SELECT COUNT(*) AS unique_words_once_total
FROM (
    SELECT wordid
    FROM m-wordscounts
    GROUP BY wordid
    HAVING SUM(count) = 1
) AS temp;

2. 统计每本书中仅出现一次的唯一单词数量(按title字母顺序排序)

这个需求针对单本书,我们要找出每本书里出现次数刚好为1的单词,统计其数量后关联书籍表获取书名并排序:

SELECT 
    b.title,
    COALESCE(COUNT(wc.wordid), 0) AS unique_words_once_per_book
FROM m-books b
LEFT JOIN (
    SELECT bookid, wordid
    FROM m-wordscounts
    WHERE count = 1
) wc ON b.id = wc.bookid
GROUP BY b.id, b.title
ORDER BY b.title ASC;

用LEFT JOIN加COALESCE是为了包含那些没有任何仅出现一次单词的书籍,此时数量会显示为0。如果只需要统计有这类单词的书籍,换成INNER JOIN即可。

3. 找出所有书籍中出现频率最高的前8个单词

这里的频率指单词在所有书籍中的总出现次数,按总次数降序排序后取前8个:

-- MySQL、PostgreSQL等支持LIMIT的数据库
SELECT 
    w.word,
    SUM(wc.count) AS total_frequency
FROM m-words w
INNER JOIN m-wordscounts wc ON w.id = wc.wordid
GROUP BY w.id, w.word
ORDER BY total_frequency DESC
LIMIT 8;

-- SQL Server版本(替换LIMIT为TOP)
SELECT TOP 8
    w.word,
    SUM(wc.count) AS total_frequency
FROM m-words w
INNER JOIN m-wordscounts wc ON w.id = wc.wordid
GROUP BY w.id, w.word
ORDER BY total_frequency DESC;

-- Oracle版本(使用FETCH语法)
SELECT 
    w.word,
    SUM(wc.count) AS total_frequency
FROM m-words w
INNER JOIN m-wordscounts wc ON w.id = wc.wordid
GROUP BY w.id, w.word
ORDER BY total_frequency DESC
FETCH FIRST 8 ROWS ONLY;

4. 计算每本书的单词计数占该书总唯一单词数的百分比

这里分两种常见场景,你可以根据实际需求选择:

场景1:占该书总唯一单词数的百分比

总唯一单词数指这本书里包含的不同单词的总数:

SELECT 
    b.title,
    w.word,
    wc.count AS word_count,
    book_stats.total_unique_words,
    ROUND((wc.count * 100.0 / book_stats.total_unique_words), 2) AS percentage
FROM m-books b
INNER JOIN m-wordscounts wc ON b.id = wc.bookid
INNER JOIN m-words w ON wc.wordid = w.id
INNER JOIN (
    SELECT bookid, COUNT(DISTINCT wordid) AS total_unique_words
    FROM m-wordscounts
    GROUP BY bookid
) book_stats ON b.id = book_stats.bookid
ORDER BY b.title, percentage DESC;

场景2:占该书总单词数的百分比

总单词数用m-count表的totalwords字段:

SELECT 
    b.title,
    w.word,
    wc.count AS word_count,
    mc.totalwords AS total_book_words,
    ROUND((wc.count * 100.0 / mc.totalwords), 2) AS percentage
FROM m-books b
INNER JOIN m-wordscounts wc ON b.id = wc.bookid
INNER JOIN m-words w ON wc.wordid = w.id
INNER JOIN m-count mc ON b.id = mc.bookid
ORDER BY b.title, percentage DESC;

内容的提问来源于stack exchange,提问作者Muhammad Umar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:50