从每个组中选择N个值

时间:2019-05-14 15:03:19

标签: mysql greatest-n-per-group

我有2个表,这些表必须联接才能获取所需的数据。

Percision: 512 Quotient: 10001000100010001000100010001000.1000100010001000155533 是文章,Table1是针对渠道/类别的。

为简单起见,两个表都只有两个字段。

基本上,我需要为每个组(Table2)选择N个唯一的ID。组之间的值不应重复。

我可以使用term_idRANK达到预期的结果,但是它仅适用于MySQL 8.x,而我需要在5.7中运行。

摆弄表格结构,一些示例数据和当前查询为here

该方法如何适应5.7 MySQL?

PARTITION

1 个答案:

答案 0 :(得分:0)

仅适用于8.0之前的版本...

SET @prev = null;
SET @i = 0;

SELECT id
     , term_id
     , date
     , i
  FROM
     (SELECT x.id
           , y.term_id
           , x.date
           , CASE WHEN @prev = term_id THEN @i:=@i+1 ELSE @i:=1 END i
           , @prev:=term_id 
        FROM (SELECT DISTINCT id, date FROM table1) x 
        JOIN table2 y 
          ON y.object_id = x.ID 
       WHERE y.term_id IN (1, 564, 91170, 568) 
       ORDER 
          BY y.term_id
           , x.date DESC
     ) n
 WHERE i<=3
 ORDER 
    BY term_id,i;

    +--------+---------+---------------------+------+
    | id     | term_id | date                | i    |
    +--------+---------+---------------------+------+
    | 195512 |       1 | 2019-02-27 12:28:18 |    1 |
    | 195260 |       1 | 2019-01-02 15:26:45 |    2 |
    | 195245 |       1 | 2019-01-02 14:22:57 |    3 |
    | 195473 |     564 | 2019-01-03 10:52:01 |    1 |
    | 192982 |     564 | 2018-12-21 19:55:42 |    2 |
    | 192695 |     564 | 2018-12-20 15:22:41 |    3 |
    | 195295 |     568 | 2019-01-02 15:23:54 |    1 |
    | 192876 |     568 | 2018-12-21 13:25:22 |    2 |
    | 192537 |     568 | 2018-12-20 11:59:50 |    3 |
    | 195260 |   91170 | 2019-01-02 15:26:45 |    1 |
    | 192676 |   91170 | 2018-12-20 15:30:08 |    2 |
    | 192409 |   91170 | 2018-12-19 15:44:59 |    3 |
    +--------+---------+---------------------+------+

请注意,样本数据集具有重复的数据。这是结构良好的RDBMS中的oxymoronix。因此,您可能要修复该问题。