Улучшите сложный запрос с помощью пользовательского столбца расчета

Способ установки атрибута y для прямоугольников будет использовать одинаковое значение для всех повторяющихся элементов. Вы можете использовать некоторые смещения так:

chart.selectAll("rect")
    .data(data)
    .enter().append("rect")
    .attr("y", function (d, i) {
       return (i * y.rangeBand()) + y.rangeBand();})
    .attr("width", x)
    .attr("height", y.rangeBand());

Также вам, возможно, придется настроить высоту вашей общей диаграммы, чтобы увидеть все полосы.

0
задан Pete Houston 17 January 2019 в 07:23
поделиться

1 ответ

MySQL материализует подзапросы. Так что вы можете попробовать написать это без подзапросов:

SELECT s.student_id,
       (ABS(s.x1 - u.x1) + ABS(s.x2 - u.x2) + ABS(s.x3 - u.x3)
       ) / 3 AS avg_cate_x,
       (ABS(s.y1 - u.y1) + ABS(s.y2 - u.y2)
       ) / 2 AS avg_cate_y,
       (ABS(s.z1 - u.z1) + ABS(s.z2 - u.z2) + ABS(s.z3 - u.z3) + ABS(s.z4 - u.z4)
       ) / 4 AS avg_cate_z,
       (5 - 
        (ABS(s.x1 - u.x1) + ABS(s.x2 - u.x2) + ABS(s.x3 - u.x3)
        ) / 3 +
        (ABS(s.y1 - u.y1) + ABS(s.y2 - u.y2)
        ) / 2 +
        (ABS(s.z1 - u.z1) + ABS(s.z2 - u.z2) + ABS(s.z3 - u.z3) + ABS(s.z4 - u.z4)
        ) / 4
       ) / 3 as final_score
FROM scores s JOIN
     scores u
     ON u.student_id = 1
ORDER by final_score DESC;

Это менее элегантно, чем использование подзапроса, но вы можете увидеть улучшение производительности.

Также поможет индекс scores(student_id).

0
ответ дан Gordon Linoff 17 January 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: