Сгруппировать, кроме определенной стоимости - PullRequest
8 голосов
/ 23 декабря 2011

Я пытаюсь создать (sqlite) запрос, который будет выполнять GROUP BY, но не будет группировать что-либо со значением 'unknown'. Например, у меня есть таблица:

id |   name  | parent_id | school_id |
 1 | john    |   1       |    1      |
 2 | john    |   1       |    1      |
 3 | john    |   1       |    1      |
 4 | nick    |   2       |    2      |
 5 | nick    |   2       |    2      |
 6 | nick    |   3       |    3      |
 7 | bob     |   4       |    4      |
 8 | unknown |   5       |    5      |
 9 | unknown |   5       |    5      |
 10| unknown |   5       |    5      |

При правильном запросе 'GROUP BY name, parent_id, school_id' мне нужны следующие строки:

id |   name  | parent_id | school_id |
 1 | john    |   1       |    1      |
 3 | nick    |   2       |    2      |
 4 | nick    |   3       |    3      |
 5 | bob     |   4       |    4      |
 6 | unknown |   5       |    5      |
 7 | unknown |   5       |    5      |
 8 | unknown |   5       |    5      |

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 4 ]

8 голосов
/ 23 декабря 2011

Вы не можете легко сделать это с одним оператором, но вы можете UNION результаты двух операторов

  • GROUP список всех , но unknown
  • Добавить (UNION) список всех unknown

Оператор SQL

SELECT MIN(id), name, parent_id, school_id
FROM   YourTable
WHERE  name <> 'unknown'
GROUP BY
       name, parent_id, school_id
UNION ALL
SELECT id, name, parent_id, school_id
FROM   YourTable
WHERE  name = 'unknown'

Обратите внимание, чтоЯ предполагаю, что вы указали неправильные unknown идентификаторы в вашем результате

3 голосов
/ 23 декабря 2011

В качестве одного запроса ...

SELECT
  MIN(id)            AS id,
  name,
  parent_id,
  school_id
FROM
  yourTable
GROUP BY
  CASE WHEN name = 'unknown' THEN id ELSE 0 END,
  name,
  parent_id,
  school_id

Или, возможно ...

GROUP BY
  CASE WHEN name <> 'unknown' THEN name ELSE CAST(id AS VARCHAR(???)) END,
  parent_id,
  school_id

-- Where VARCHAR(???) is the data type of the `name` field.
-- Also assumes no value in `name` is the same as an id for an 'unknown' field

Оба избегают UNION и накладных расходов на синтаксический анализ таблицы дважды, заменяя ее слегкаповышенная сложность GROUP BY.

1 голос
/ 23 декабря 2011
SELECT 
  MIN(id) AS id,
  IF(tmpname=id,"unknown",tmpname) AS name,
  parent_id,
  school_id
FROM (
  SELECT 
    id,parent_id,school_id
    IF(name="unknown",id,name) AS tmpname
  FROM <tablename>
) AS baseview
GROUP BY tmpname
1 голос
/ 23 декабря 2011
SELECT  MIN(id), name, parent_id, school_id
  FROM  Table
WHERE   name <> 'unknown'
GROUP BY name, parent_id, school_id
UNION ALL
SELECT  id, name, parent_id, school_id
  FROM  Table
 WHERE  name = 'unknown'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...