SQL получает все строки, которые удовлетворяют условию 1, когда хотя бы одна из них также удовлетворяет условию 2 - PullRequest
0 голосов
/ 21 мая 2018

У меня есть таблица A с комбинацией UNIQUE (ID, FK) и столбцом modified.

Мне нужно сгруппировать все записи таблицы A с одинаковыми FK, когда хотя бы одна из этих записей совпадаетCONDITION на основе modified.

Это то, что я сейчас делаю

SELECT * 
FROM 
    (SELECT COUNT(*) AS count, FK, MAX(modified) 
     FROM A 
     GROUP BY FK) AS A 
WHERE 
    (modified > date1 AND modifed <= date2)

Проблема в том, что CONDITION дает очень меньшее количество записей, например 1% отзаписи из GROUP BY.Я запускаю GROUP BY на всей таблице без необходимости


Спасибо всем за помощь, благодаря вашим усилиям я понял, что, хотя избыточность Grouping everything and then filtering является лучшим решением в этой ситуации.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Вы можете упростить выражение, используя HAVING:

SELECT FK, MAX(modified)
FROM A
GROUP BY FK
HAVING SUM(CASE WHEN modified > date 1 and modifed < date2 THEN 1 ELSE 0 END) > 0;

Это не изменит производительность.Для этого используйте EXISTS (или IN):

select fk, max(modified)
from a
where exists (select 1
              from a a2
              where a2.fk = a.fk and a2.modified > date1 and a2.modified < date2
             )
group by fk;

. Этот фильтр предшествует group by, поэтому он должен сделать агрегацию более эффективной.Вы хотите индекс на a(fk, modified).

0 голосов
/ 21 мая 2018

Вам не нужно включать строку в group by, просто используйте предложение where перед group by

SELECT COUNT(*) AS count, MAX(modified) 
WHERE (modified > date1 OR modifed <= date2)
FROM A 
GROUP BY FK;
0 голосов
/ 21 мая 2018
SELECT FK, MAX(modified) m
FROM A 
GROUP BY FK
HAVING (m > date1 AND m <= date2)

Вот аналог Postgres

http://sqlfiddle.com/#!17/2230a/6

SELECT FK, MAX(modified) AS m
FROM A 
GROUP BY FK
HAVING (MAX(modified) > (now()-INTERVAL '1 DAY') AND MAX(modified) <= now())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...