SQL получает только элементы со всеми значениями в столбце

У меня есть запрос sql, как это:

SELECT m.id, 
e.id AS extraction_id, 
row_number() OVER (PARTITION BY m.id ORDER BY e.start_time DESC) as 
   start_date_rank,
e.end_time AS e_end_time, 
e.status AS e_status
FROM monitors m 
LEFT JOIN extractions e 
ON m.id = e.monitor_id 
WHERE m.is_deleted is FALSE

Я получаю эти строки: SQL получает только элементы со всеми значениями в столбце

Моя проблема в том, что мне нужны только эти идентификаторы, где во всех столбцах e_end_time есть временные метки. В этом примере это только идентификатор 2. Может ли кто-нибудь помочь мне, как это сделать?

Id 1 имеет отметку времени, но только в первой строке. Вторая и третья строки имеют значение null в столбце e_end_time, поэтому оно не должно возвращаться.

База данных PostgreSQL

M. Barabas 10.04.2019 22:30

Разве результат не должен быть ID 1 и 2, поскольку они оба имеют временные метки?

Paolo 10.04.2019 22:36

Потому что мне нужны только идентификаторы, в которых все строки e_end_time имеют отметку времени.

M. Barabas 10.04.2019 22:38

id 1 имеет значение временной метки, мы что-то упустили или смотрим на разные изображения :)

rs. 10.04.2019 22:39

Да, у id 1 есть метка времени, но только в первой строке. Вторая и третья строки имеют значение null в столбце e_end_time.

M. Barabas 10.04.2019 22:40

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

Joakim Danielson 10.04.2019 22:40
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
215
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Добавьте подзапрос NOT IN в предложение WHERE.

WHERE m.is_deleted is FALSE
  AND m.id NOT IN (SELECT DISTINCT monitor_id 
                   FROM extractions
                   WHERE end_time IS NULL)

Добавление этого в предложение where должно удалить идентификаторы с нулевым временем окончания.

and m.id not in (select id from monitors where e_end_time is null)
SELECT m.id, 
e.id AS extraction_id, 
row_number() OVER (PARTITION BY m.id ORDER BY e.start_time DESC) as 
   start_date_rank,
e.end_time AS e_end_time, 
e.status AS e_status
FROM monitors m 
LEFT JOIN extractions e 
ON m.id = e.monitor_id 
WHERE m.is_deleted is FALSE
and m.id not in (select id from monitors where e_end_time is null)

Вы делаете это неправильно, это будет включать в себя много строк в результате

Joakim Danielson 10.04.2019 22:52

Вы можете просто использовать group by:

SELECT m.id
FROM monitors m LEFT JOIN
     extractions e 
     ON m.id = e.monitor_id 
WHERE m.is_deleted is FALSE
GROUP BY m.id
HAVING COUNT(*) = COUNT(e.end_time);

И почему это должно быть анонимно заминусовано? Кажется, это именно то, чего хочет OP, а именно получить все id, которые имеют не-NULL значения в e.end_time.

Gordon Linoff 10.04.2019 22:54
SELECT m.id, 
e.id AS extraction_id, 
row_number() OVER (PARTITION BY m.id ORDER BY e.start_time DESC) as 
   start_date_rank,
e.end_time AS e_end_time, 
e.status AS e_status
FROM monitors m 
LEFT JOIN extractions e 
ON m.id = e.monitor_id 
WHERE m.is_deleted is FALSE AND DATALENGTH(e.end_time)<>0

Функция DATALENGTH() возвращает количество байтов, используемых для представления выражения.

DataLength - лучший способ решить вашу проблему, потому что он также удаляет пустое пространство...

Спасибо!!!

Другие вопросы по теме