Строки запроса PostgreSQL с наименьшим нулевым значением в столбцах - PullRequest
0 голосов
/ 08 января 2019

Как я могу запросить строки, где на выходе будут строки с наименьшим нулевым значением в столбцах?

Мои данные:

ID         | col1     | col2      | col3      | col4     
-----------+----------+-----------+-----------+-----------
 1         | Null     |Null       | with value| with value
 2         |with value|Null       | with value| with value
 3         |with value|Null       | Null      | Null       

где результат будет:

 ID         | col1     | col2      | col3      | col4     
 -----------+----------+-----------+-----------+-----------
  2         |with value|Null       | with value| with value  

Потому что id 2 - это запись с наименьшим количеством нулевых значений. Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если вы хотите только одну строку, то вы можете сделать:

select t.*
from t
order by ( (col1 is null)::int + (col2 is null)::int +
           (col3 is null)::int + (col4 is null)::int
         ) asc
fetch first 1 row only;

Если вы хотите все такие строки, я думаю, я бы сделал:

select t.*
from (select t.*,
             dense_rank() over 
                 (order by (col1 is null)::int + (col2 is null)::int +
                           (col3 is null)::int + (col4 is null)::int
                 ) as null_ranking
      from t
     ) t
where null_ranking = 1;
0 голосов
/ 08 января 2019

Вы можете:

  1. Порядок строк по количеству нулей (по возрастанию)
  2. Ограничить количество строк до 1 (LIMIT 1)

Ваш код:

SELECT *
FROM your_table
ORDER BY 
    CASE WHEN col1 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col2 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col3 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col4 IS NULL THEN 1 ELSE 0 END 
LIMIT 1
...