【问题标题】:How do I get the first and last 10 records in a table?如何获取表中的第一个和最后 10 条记录?
【发布时间】:2021-09-01 14:43:31
【问题描述】:

我需要找到 10 名员工当前工资与他们被录用时的薪水之间的最大差异和 10 名差异最小的员工。 该表类似于salary table,包含 2844047 条记录。 我的代码是:

WITH t1 AS (
    SELECT emp_no, FIRST_VALUE(salary) OVER (PARTITION BY emp_no ORDER BY from_date) AS `first`
    FROM salaries),
     t2 AS (
         SELECT emp_no, salary AS last
         FROM salaries
         WHERE to_date = '9999-01-01')
(SELECT DISTINCT emp_no, last - first AS `diff`
    FROM t1
             INNER JOIN t2 USING (emp_no)
    ORDER BY `diff`
    LIMIT 10)
UNION ALL
(SELECT DISTINCT emp_no, last - first AS `diff`
    FROM t1
             INNER JOIN t2 USING (emp_no)
    ORDER BY `diff` DESC
    LIMIT 10);

但执行此操作需要很多时间。

to_date = '9999-01-01' 表示员工仍在工作的条件。

如何优化这个查询,让它执行得更快?

【问题讨论】:

  • 这听起来像是横向连接的工作,但这是 mysql/maria 仍然所没有的。

标签: sql performance optimization mariadb query-optimization


【解决方案1】:

join 不是必需的。或许这样会快一点:

SELECT s.*
FROM (SELECT s.*,
             ROW_NUMBER() OVER (ORDER BY salary - first ASC) as seqnum,
             ROW_NUMBER() OVER (ORDER BY salary - first DESC) as seqnum_desc
      FROM (SELECT s.*,
                  FIRST_VALUE(salary) OVER (PARTITION BY emp_no ORDER BY from_date) AS first
            FROM salaries s
           ) s
      WHERE to_date = '9999-01-01'
     ) s
WHERE seqnum_asc <= 10 or seqnum_desc <= 10;

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2016-04-05
    相关资源
    最近更新 更多