PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SQL:как да изберете реда с най-известните стойности?

Ще бъде болезнено; много болезнено.

Вашият въпрос не е ясен относно този проблем, но предполагам, че „потребителското име“, за което говорите, е потребителското име. Има последващи модификации, които трябва да направите, ако това не е наред.

Както при всяка сложна заявка, изграждайте я на етапи.

Етап 1:Колко ненулеви полета има на запис?

SELECT username, sex, date_of_birth, zip,
       CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
       CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
       CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
  FROM users_log

Етап 2:Какъв е максималният такъв брой полета за дадено потребителско име?

SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
  FROM (SELECT username, sex, date_of_birth, zip,
               CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
               CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
               CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
          FROM users_log
       ) AS u
 GROUP BY username

Етап 3:Изберете (всички) редове за даден потребител с този максимален брой ненулеви полета:

SELECT u.username, u.sex, u.date_of_birth, u.zip
  FROM (SELECT username, MAX(num_non_null_fields) AS num_non_null_fields
          FROM (SELECT username, sex, date_of_birth, zip,
                       CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
                       CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
                       CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
                  FROM users_log
               ) AS u
         GROUP BY username
       ) AS v
  JOIN (SELECT username, sex, date_of_birth, zip,
               CASE WHEN sex           IS NULL THEN 0 ELSE 1 END +
               CASE WHEN date_of_birth IS NULL THEN 0 ELSE 1 END +
               CASE WHEN zip           IS NULL THEN 0 ELSE 1 END AS num_non_null_fields
          FROM users_log
       ) AS u
    ON u.username = v.username AND u.num_non_null_fields = v.num_non_null_fields;

Сега, ако някой има няколко реда с (да кажем) и трите попълнени полета, тогава всички тези редове ще бъдат върнати. Вие обаче не сте посочили критерии, по които да избирате между тези редове.

Основните техники тук могат да бъдат адаптирани към всякакви променени изисквания. Ключът е да създавате и тествате подзаявките, докато вървите.

Нито един от тези SQL не е бил близо до СУБД; може да има грешки в него.

Не сте посочили коя СУБД използвате. Изглежда обаче, че Oracle няма да хареса нотацията AS, използвана за псевдоними на таблици, въпреки че няма проблем с AS на псевдоними на колони. Ако използвате друга СУБД, не трябва да се притеснявате за тази малка ексцентричност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Импортиране на файлове от PostgreSQL в R

  2. Уникално ограничение с условия в MYSQL

  3. Свързване с база данни PostgreSQL чрез SSH тунелиране в Python

  4. Как да използвате pgBackRest за архивиране на PostgreSQL и TimescaleDB

  5. Заявка за елемент от масив в колона JSON