1. 程式人生 > >Mysql分組統計、排序、取前N條記錄解決方案

Mysql分組統計、排序、取前N條記錄解決方案

今日根據專案需求,需要在mysql中解決記錄的分組統計、排序,並抽取前10條記錄的功能。現已解決,解決方案如下:

1)表結構

<span style="font-size:18px;">CREATE TABLE `policy_keywords_rel` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `content_id` int(11) NOT NULL COMMENT '文章id',
  `keyword_id` int(11) NOT NULL COMMENT '關鍵詞id',
  `cnt` int(11) NOT NULL COMMENT '關鍵詞頻次',
  `n` varchar(10) DEFAULT NULL,
  `keyword` varchar(90) DEFAULT NULL COMMENT '關鍵詞名稱',
  PRIMARY KEY (`content_id`,`keyword_id`),
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章與關鍵詞關係表'</span>

原始表部分資料截圖如下所示:


2)實現功能

根據欄位‘n’(關鍵詞類別)和‘keyword_id’(關鍵詞id)進行分組統計每個類別下相同關鍵詞的總頻次('cnt'為關鍵詞的頻次),然後根據關鍵詞總頻次進行降序排序,最後抽取每個分組下總頻次排名前10的關鍵詞。

3)解決方案

<span style="font-size:18px;">SET @row=0; SET @mid= ''; 
SELECT T2.* FROM (SELECT T.*,case WHEN @mid=n THEN @row:[email protected]+1 ELSE @row:=1 END rownum,@mid:=n mid FROM (SELECT keyword_id,keyword,sum(cnt),n FROM policy_keywords_rel  
GROUP BY keyword_id, n ORDER BY n,sum(cnt) DESC) AS T ) AS T2
WHERE T2.rownum<=10</span>

解決思路:變數@row用來做rownum,變數@mid用來分組。最裡層的sql語句通過group by與order by語句獲取分組統計好的資料集,即根據關鍵詞類別及關鍵詞進行分組、統計所有文章相同在每個類別下相同關鍵詞的總頻次;中間層的sql語句獲取每組分類的rownum,當mid的值與分組欄位n的值相同是rownum自增,若不相同則從1開始計數;最外層的sql語句根據rownum抽取每組分類的記錄個數。


執行結果如下所示:


相關推薦

Mysql分組統計排序N記錄解決方案

今日根據專案需求,需要在mysql中解決記錄的分組統計、排序,並抽取前10條記錄的功能。現已解決,解決方案如下: 1)表結構 <span style="font-size:18px;">CREATE TABLE `policy_keywords_rel` (

Linq分組排序N記錄

Linq多欄位分組排序並取前N條記錄時,一定要先分組再排序,不然取到的記錄是不規則的 程式碼示例【按HotWord分組,並取sorNum倒序,取前15條記錄】 [Route("api/

mysql使用GROUP BY分組實現N記錄的方法

cls class ges rom 當前 分組 實現 一個 images MySQL中GROUP BY分組取前N條記錄實現 mysql分組,取記錄 GROUP BY之後如何取每組的前兩位下面我來講述mysql中GROUP BY分組取前N條記錄實現方法。 這是測試表(也

mysql學生成績排名,分組 N 記錄

score表: CREATE TABLE `score` ( `student_id` int(10) DEFAULT NULL, `class_id` int(10) DEFAULT NULL, `score` int(5) DEFAULT

sql語句分組查詢排序後取出n記錄

1.sql語句分組排序後取出前n條記錄 (SELECT * FROM ( SELECT "row_number" () OVER ( PARTITION BY mmsi ORDER BY orginal_in_draught DESC ) A

使用Kettle 對記錄排序前面n記錄的方法

2.1:測試資料準備工作 -- 建立表 CREATE TABLE `tmallorder` (   `datekey` INT(11) NOT NULL,-- 日期   `storename` VARCHAR(50) CHARACTER SET utf8 COLLATE u

Mysql和Oracl 分組每組N記錄

MySQL取每組的前N條記錄:使用自連線的方式一、對分組的記錄取前N條記錄:例子:取前 2條最大(小)的記錄1234567891011121314151617181.用子查詢:SELECT * FROM right2 a  WHERE 2>(SELECT COUNT(*

JAVA List根據字段排序以及數據

字段排序 .so ret sort etime com sub clas tar 1.經常會遇到對組裝的list排序或提取list中前幾條數據,例如: 根據時間排序: 1 list.sort((o1, o2) -> o2.getCreateTime().compar

jdk1.8-map根據value排序n位(及簡)

public static void main(String[] args) { Map<String,Integer> mapRepeat = new HashMap<>(); mapRepeat.put("aa", 1);

MySQL每組的N記錄

  MySQL 分組後取每組前N條資料 與oracle的 rownumber() over(partition by xxx  order by xxx )語句類似,即:對錶分組後排序 CREATE TABLE `mygoods` ( `goods

分組查詢每組n記錄例項

假設有這樣一張運動員比賽成績表 tb_score 現在要求查詢出每個國家的前三名的成績記錄,查詢語句可以這樣寫: 1、 select t3.id,t3.country,t3.score fro

es java 聚合方法——聚合後根據count排序2資料

聚合後根據count排序並取前2條資料 /** * 聚合後根據count排序並取前2條資料 */ @Test public void orderAfterAggregation(){ SearchResp

Oracle SQL分析函式row_number()獲取n記錄去除重複記錄

分析函式ROW_NUMBER應該是大家使用非常多的分析函數了。 常用來實現獲取前n條,前1條記錄、去除重複等需求。 下面根據官方文件的內容做下簡單的介紹: 語法: 示例: ROW_NUMBER() OVER (PARTITION BY department_id O

排序後的結果集中刪除 n記錄

not null ima -- date com alt delet lec log 端午有人休息,有人忙 操作前數據: --從排序後的結果集中刪除 前n條記錄delete from emp where empno in (select empno

Oracle 中sql語句中的n數據

沒有 blog tab 註意 sql table bsp num 數據 取得薪水最高的前五名員工 sql: select * from ( select empno,ename,sal from emp order by sal desc) where rownum&l

parttion by ~~~針對某個欄位或多個欄位重複,資料只n。問題例子:1.主評論下的評論按著 時間正序最多隻5 2.獲取最新登入記錄......

分組目前已知partition by、group by partition by用於給結果集分組分割槽,如果沒有指定那麼它把整個結果集作為一個分組,最後顯示具體資料 group by:通過所查詢的資料的某一欄位或屬性進行分組,最後顯示組資料,而不是具體資料,因為select 後面的所有列中,沒有使用聚合函

mysql查詢某屬性下所有值的N記錄

例如, 姓名 科目 成績 王 數學 100 王 語文 99 王 英語 98 王 生物 97 王 政治 96 王 物理 95 王 化學 94 王 體育 93

用postgresql特性簡化group by 後每組n記錄的方法

需求: 求一段時間內各生產線前3名壞機的原因及壞機數. step 1, 從將原始資料中抽取品質資料放於t96臨時表 create temp table t96 on commit drop as

Mysql獲取每組N記錄(開窗函式)

由於專案需求,我需要把查詢出來的資料進行分組,並且只需要每組前三條記錄,後來瞭解到MySQL實現開窗函式的方法,用了之後發現是可以,但今天發現這個方法在Navicat Premium軟體中執行第一次所查詢出來的資料不符合,執行第二次才是符合要求,具體原因有空再瞭

Oracle 子查詢,按降序排列,n

比如,有一個student 表: id             student_name      1                                  s1 2                                  s2 03