MySQL вычисляет коэффициенты по результатам группового запроса - PullRequest
0 голосов
/ 25 октября 2018

ADD:

SQL-запрос:

SELECT s.name
     , d.feeling
     , COUNT(1) AS times 
  FROM data_table d
     , staff s 
 WHERE d.nid = s.id 
   AND d.project_id = 1 
   AND d.crawl_time BETWEEN '2018-10-17' AND '2018-10-24' 
   AND LENGTH(TRIM(d.feeling)) > 0 
 GROUP 
    BY d.nid
     , d.feeling

ADD (END)

Я пишу sql взапросите время каждой группы чувств тела по имени и чувству.Вот результат.

-- a certain sql returns, not an existing table --    
`name`  `feeling`   `times`  (expect)
Jack     happy        10       0.45
Jack     sad          7        0.31
Jack     common       5        0.22
Lily     happy        3        0.27
Lily     sad          6        0.54
Lily     common       2        0.18
Sam      happy        6        0.42
Sam      sad          7        0.5
Sam      common       1        0.07

Теперь цель состоит в том, чтобы рассчитать соотношение всех чувств.Например, счастливое чувство Джека берет 10/(10+7+5) его чувств, а для грустного чувства - 7/(10+7+5).При использовании SUM(result.count) и GROUP BY name для фигуры грустные или общие чувства не могут проявиться.Тогда я использую подзапрос, но таблицы не существует.Есть ли способ работать без создания представления?

1 Ответ

0 голосов
/ 25 октября 2018

Одно решение, которое должно работать на любой версии MySQL, использует подзапрос, чтобы найти сумму times для каждого имени, а затем присоединяется к нему:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / t2.times_sum AS feeling_ratio
FROM yourTable t1
INNER JOIN
(
    SELECT name, SUM(times) AS times_sum
    FROM yourTable
    GROUP BY name
) t2
    ON t1.name = t2.name;

Если вы используете MySQL 8+или позже, и иметь доступ к аналитическим функциям, тогда есть более простой способ написать это:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / SUM(t1.times) OVER (PARTITION BY t1.name) AS feeling_ratio
FROM yourTable t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...