MS Access - выбор с помощью агрегатной функции - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующая таблица. Я хотел бы сделать две вещи: Я хотел бы выбрать все строки для всех людей, имеющих более одной активной записи.

PersonName  Address Active  DateUpdated
Adam    Paris   False   09/08/2018
Adam    Dubai   True    17/02/2018
Brendan New York    False   17/02/2018
John    Dublin  True    17/02/2018
John    London  True    09/02/2018
Mike    Miami   False   10/02/2018
Mike    Singapore   False   01/02/2018
Mike    New York    True    01/03/2018
Susan   Los Angeles True    19/02/2018
Susan   Las Vegas   True    17/01/2018
Zara    Berlin  True    05/09/2018
Zara    Madrid  True    12/07/2018
Zara    Houston False   12/09/2018

Запрос:

select PersonName,Count(PersonName)
from tempTableTest where Active=True
group by PersonName

Придает

PersonName  Expr1001
Adam    1
John    2
Mike    1
Susan   2
Zara    2

Таким образом, в моей результирующей таблице должны быть все строки, в которых PersonName = John, Susan или Zara (поскольку каждая из них имеет более 1 записи, где Active = True). И я ожидаю, что это будет выглядеть так -

PersonName  Address DateUpdated Active
John    London  09/02/2018  True
John    Dublin  17/02/2018  True
Susan   Las Vegas   17/01/2018  True
Susan   Los Angeles 19/02/2018  True
Zara    Berlin  05/09/2018  True
Zara    Madrid  12/07/2018  True
Zara    Houston 12/09/2018  False

Я также хотел бы обновить Active = False, где DateUpdated <> Max (DateUpdated), если это имеет смысл. Так что для Джона строка с 09/02/2018 должна быть установлена ​​в False (потому что есть 17/02/2018) Для Сьюзен 17/01/2018 строка должна быть установлена ​​в False И Зара 09.05.2008 и 12.07.08 должна быть установлена ​​в False.

Кто-нибудь может помочь? (Буду очень признателен, спасибо заранее!).

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Вот запрос на обновление.

UPDATE 
    t52293469 AS T 
SET 
    T.Active = False, T.PersonName = "a", T.DateUpdated = Now()
WHERE 
(
    ((T.Active)=True) 
    AND ((Exists (SELECT 1 
                  FROM t52293469 t1 
                  WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.DateUpdated >t.DateUpdated
    ))=True)
);

Это обновит Джона, Сьюзан и Зара

0 голосов
/ 12 сентября 2018

Вы можете использовать предложение EXISTS, чтобы проверить, существуют ли определенные условия:

SELECT t.*
FROM tempTableTest t
WHERE EXISTS(
      SELECT 1 
      FROM tempTableTest s 
      WHERE s.Active=True AND s.PersonName = t.PersonName
      GROUP BY PersonName 
      HAVING Count(*) > 1
)
0 голосов
/ 12 сентября 2018

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

SELECT t.*
FROM tempTableTest t
WHERE EXISTS (SELECT 1 
              FROM tempTableTest t1 
              WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.Address <> t.Address
             );
0 голосов
/ 12 сентября 2018

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

SELECT t1.*
FROM tempTableTest t1
INNER JOIN
(
    SELECT PersonName
    FROM tempTableTest
    WHERE Active = True
    GROUP BY PersonName
    HAVING COUNT(*) > 1
) t2
    ON t1.PersonName = t2.PersonName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...