2017-02-01 2 views
1

Я пытаюсь сортировать записи базы данных по частоте значений строк в порядке убывания, но без группировки записей. Извините, я новичок в базах данных.Результаты сортировки Android SQLite по частоте без группировки

Вот полный код:

SELECT * 
FROM  table_name 
WHERE date_time >= 10 
and  date_time <= 100 
GROUP BY activity_type 
ORDER BY COUNT(activity_type) DESC 

А вот соответствующий код:

SELECT * 
FROM  table_name 
GROUP BY activity_type 
ORDER BY COUNT(activity_type) DESC 

Это желаемый результат (отсортированный по частоте activity_type в убывающем порядке без группировки) :

name (irrelevant) activity_type (number) 
------------------------------------------------ 
Rome      1 
London      1 
Madrid      1 
Stockholm     3 
Paris      3 
Moscow      2 
+0

Можете ли вы предоставить некоторые данные образца? – Siyual

+0

Я отредактировал «желаемый результат». Я надеюсь, что квест теперь более ясен. Слишком много столбцов в исходной базе данных, это будет только беспорядок, обеспечивающий их здесь. –

ответ

1

К сожалению, SQLite не поддерживает group by в подзапросах. Таким образом, ваш выбор - это либо внешнее соединение (которое создает перекрестное произведение таблицы отдельно и которое затем отбирается с помощью group by) или временную таблицу, которая будет содержать activity_type подсчетов.

CREATE TABLE activity_count_table(activity_type, activity_count); 

INSERT INTO activity_count_table 
    SELECT activity_type, COUNT(activity_type) AS activity_count 
    FROM table_name 
    WHERE date_time BETWEEN 10 AND 100 
    GROUP BY activity_type; 

SELECT * 
FROM table_name NATURAL JOIN activity_count_table 
WHERE date_time BETWEEN 10 AND 100 
ORDER BY activity_count_table.activity_count DESC; 

DROP TABLE activity_count_table; 

Очевидно, что это не идеальное решение. Вероятно, вы захотите добавить уникальный уникальный идентификатор к имени activity_count_table для каждого вызова (чтобы несколько запросов не мешали друг другу).

Это все же лучше, чем создание внешнего соединения (в котором требуется n^2 строки в памяти), а затем отбраковка его group by (что на самом деле просто дает вам диагональ при применении к самосоединению).

0

Если ваша база данных поддерживает его, вы можете использовать функцию оконной обработки с помощью OVER, т.е.

SELECT * 
    FROM table_name 
ORDER BY COUNT(*) OVER (PARTITION BY activity_type) DESC 

Подтвержденные работать на:

  • MS SQL Server 2008 R2
  • PostgreSQL 9,3
+0

Спасибо, но, к сожалению, Android SQLite не поддерживает его. –

+0

@ TadeášBraun Возможно, если бы вы упомянули SQLite в своем вопросе (например, пометить его), мы бы знали ограничить ответы на эту конкретную реализацию RDBMS. – Andreas

+0

Прошу прощения, я должен был это сделать ... –

1

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

SELECT * 
FROM table_name 
WHERE date_time BETWEEN 10 AND 100 
ORDER BY (SELECT count(*) 
      FROM table_name AS T2 
      WHERE T2.activity_type = table_name.activity_type 
      AND date_time BETWEEN 10 AND 100) DESC; 
+0

Если SQLite поддерживает подзапрос в предложении 'ORDER BY', тогда это правильный ответ, за исключением того, что в подзапросе отсутствует проверка диапазона date_time. Без него счет будет неправильным, и, следовательно, порядок будет отключен. – Andreas

+0

Исправлено. Благодаря! –

Смежные вопросы