Строка SQLite SELECT, ГДЕ число полей, не равных нулю, попадает в диапазон - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь сгруппировать набор данных в управляемые куски. Чтобы определить приоритеты записей, на которых нужно сосредоточиться в первую очередь, я хочу сгруппировать записи в порции уровня «полнота», где полнота == число столбцов, не равных нулю в данной строке. У меня проблемы с логи c, чтобы только вернуть строки с определенным количеством столбцов не равно нулю.

Например, если у меня была таблица с 10 столбцами и 10 строками.

  1. Группа 1 будет содержать все строки, где число столбцов, не равное нулю для данной строки, больше или равно 8. ie.) НЕ НУЛЬ>> 8

  2. Группа 2 будет содержать все строки, где число столбцов, не равное нулю для данной строки, больше или равно 6 и меньше 8. ie.) IS NOT NULL> = 6 и NOT NULL <8 </p>

  3. Группа 3 будет содержать все строки, где число столбцов, не равное нулю для данной строки, больше или равно 4, и менее 6.

  4. Et c.

Мой запрос ниже является ближайшей попыткой, но он явно не работает, и я не уверен, как бы я пропустил oop через каждый столбец и увеличил бы Logic на 1 каждый время вместо того, чтобы просто заменить одно значение на 1 или 0. Было бы лучше сделать это таким образом? Где я перебираю и увеличиваю значение в новом столбце на основе количества NULL-столбцов, а затем просто фильтрую на основе этого значения?

В качестве альтернативы, в идеале я мог бы просто возвращать строки, где количество столбцов, не равное нулю, попадает в заданный диапазон. Но я не уверен, возможно ли это в SQLite.

SELECT *
CASE WHEN * IS NOT NULL
    THEN 1
    ELSE 0
    END AS Logic
FROM contacts_all
WHERE Logic >=8;

Возможно ли это в SQLite? Я пытался сделать это в Python хорошо, но набор данных настолько массивен, что каждый раз сбивает мой компьютер. Честно говоря, вероятно, потому что мой код python является мусором.

Любые отзывы или мысли были бы очень ценными и ценными, спасибо!

РЕДАКТИРОВАТЬ: Стоит также упомянуть, что любое решение, связанное с набором текста имена каждого из столбцов не идеальны (хотя приветствуются!), так как количество столбцов равно 247. Я надеюсь, что не буду вводить каждое из этих имен в запрос. Хотя я мог бы просто использовать CONCAT для форматирования в Excel, я хотел бы узнать, как на самом деле сделать это в SQL.

EDIT2: вот пример таблицы и желаемых результатов:

+---------+---------+---------+------+
|  Col1   |  Col2   |  Col3   | Col4 |
+---------+---------+---------+------+
| Value 1 | Value 2 | Value 3 | NULL |
| Banana  | 123     | NULL    | NULL |
| Banana  | 123     | NULL    | NULL |
| Banana  | NULL    | NULL    | NULL |
+---------+---------+---------+------+

Группа 1: ГДЕ число полей не равно нулю> = 3 Возвращает строку 1

Группа 2: ГДЕ число полей не равно нулю <3 И> = 2 Возвращает строки 1, 2, 3

Группа 3: ГДЕ число полей не равно нулю <2 AND> = 1 Возвращает строки 1, 2, 3, 4

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете применить свое условие следующим образом:

SELECT *
FROM contacts_all
WHERE 
  (col1 IS NOT NULL) + (col2 IS NOT NULL) + (col3 IS NOT NULL) + (col4 IS NOT NULL) + (col5 IS NOT NULL) + 
  (col6 IS NOT NULL) + (col7 IS NOT NULL) + (col8 IS NOT NULL) + (col9 IS NOT NULL) + (col10 IS NOT NULL) >= 8

Каждое условие (colX IS NOT NULL) оценивается как 1 для TRUE или 0 для FALSE. Вы можете использовать BETWEEN 6 AND 7 вместо >= 8 или любого другого действующего оператора. Или используйте CTE, в котором вы будете вычислять количество ненулевых столбцов:

WITH cte AS (
  SELECT *,
    (col1 IS NOT NULL) + (col2 IS NOT NULL) + (col3 IS NOT NULL) + (col4 IS NOT NULL) + (col5 IS NOT NULL) + 
    (col6 IS NOT NULL) + (col7 IS NOT NULL) + (col8 IS NOT NULL) + (col9 IS NOT NULL) + (col10 IS NOT NULL) AS Logic
  FROM contacts_all
)
SELECT * FROM cte
WHERE Logic >= 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...