У меня есть запрос 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
Моя проблема в том, что мне нужны только эти идентификаторы, где во всех столбцах e_end_time есть временные метки. В этом примере это только идентификатор 2. Может ли кто-нибудь помочь мне, как это сделать?
Id 1 имеет отметку времени, но только в первой строке. Вторая и третья строки имеют значение null в столбце e_end_time, поэтому оно не должно возвращаться.
Разве результат не должен быть ID 1 и 2, поскольку они оба имеют временные метки?
Потому что мне нужны только идентификаторы, в которых все строки e_end_time имеют отметку времени.
id 1 имеет значение временной метки, мы что-то упустили или смотрим на разные изображения :)
Да, у id 1 есть метка времени, но только в первой строке. Вторая и третья строки имеют значение null в столбце e_end_time.
Могу ли я предложить вам перефразировать это конкретное предложение, поскольку не очевидно, что это то, чего вы хотите (хотя ваш комментарий совершенно ясен :))
Добавьте подзапрос 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)
Вы делаете это неправильно, это будет включать в себя много строк в результате
Вы можете просто использовать 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
.
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 - лучший способ решить вашу проблему, потому что он также удаляет пустое пространство...
Спасибо!!!
База данных PostgreSQL