Mysql - считать строки, пока не будет достигнуто первое отличное значение - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь подсчитать количество строк до первого появления отдельного значения для каждого отдельного значения.

Пример таблицы

game winner
-----------
1    Mark
2    Joe
3    Mark
4    Paula
5    Paula
6    Paula
7    Joe
8    Anna

С запросом ниже я получаю это ..

SELECT winner,COUNT(*) as count FROM tablename GROUP BY winner;

Результат

Mark won 2 games
Joe won 2 games
Paula won 3 games
Anna won 1 game

Ниже приведены результаты, которые я хочу получить:

Mark won 2 games, but didn't won last 6 games 
Joe won 2 games, but didn't won last 1 games 
Paula won 3 games, but didn't won last 2 games 
Anna won 1 game, but didn't won last 0 games

Спасибо, что нашли время помочь мне, я действительноценю это.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(game SERIAL PRIMARY KEY
,winner VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'Mark'),
(2,'Joe'),
(3,'Mark'),
(4,'Paula'),
(5,'Paula'),
(6,'Paula'),
(7,'Joe'),
(8,'Anna');

SELECT x.winner 
     , y.total
     , COUNT(z.game) games_since_last_win
  FROM my_table x 
  JOIN 
     ( SELECT COUNT(game) total
            , MAX(game) game 
         FROM my_table 
        GROUP 
           BY winner
     ) y 
    ON y.game = x.game
  LEFT
  JOIN my_table z
    ON z.winner <> x.winner
   AND z.game > x.game
 GROUP   
    BY x.winner;
+--------+-------+----------------------+
| winner | total | games_since_last_win |
+--------+-------+----------------------+
| Anna   |     1 |                    0 |
| Joe    |     2 |                    1 |
| Mark   |     2 |                    5 |
| Paula  |     3 |                    2 |
+--------+-------+----------------------+
0 голосов
/ 19 февраля 2019

Я основал свой ответ на этом

Я бы отсортировал по убыванию по играм и использовал его рейтинг, а затем обернул ваш запрос вокруг этого.

Iизменено COUNT(*) as count на COUNT(*) as cnt во избежание путаницы, count является ключевым словом SQL

Схема (MySQL v5.7)

CREATE TABLE test (
  `game` INTEGER,
  `winner` VARCHAR(5)
);

INSERT INTO test
  (`game`, `winner`)
VALUES
  (1, 'Mark'),
  (2, 'Joe'),
  (3, 'Mark'),
  (4, 'Paula'),
  (5, 'Paula'),
  (6, 'Paula'),
  (7, 'Joe'),
  (8, 'Anna');

Запрос # 1

SELECT winner, COUNT(*) as cnt, MIN(rank) AS lastwon FROM
(
    SELECT    winner,
              game,
              @curRank := @curRank + 1 AS rank
    FROM      test, (SELECT @curRank := -1) r
    ORDER BY  game DESC
 ) ranking
 GROUP BY winner
 ORDER BY cnt;

Вывод

| winner | cnt | lastwon |
| ------ | --- | ------- |
| Anna   | 1   | 0       |
| Joe    | 2   | 1       |
| Mark   | 2   | 5       |
| Paula  | 3   | 2       |

Просмотр на БД Fiddle

0 голосов
/ 19 февраля 2019

Вы можете сосчитать последние не выигранные игры в коррелированном подзапросе.

select winner, count(*) as won, (
  select count(*)
  from tablename t2
  where t2.game > max(t1.game)
) as not_won
from tablename t1
group by winner

Демонстрация: https://www.db -fiddle.com / f / czHPqscvEGgLPLeVYHV5hk / 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...