AstralProjection
@AstralProjection

Как правильно выбрать данные по диапазону дат с подзапросом?

5de0bb44c8a60927370012.jpeg
Есть база пользователей, их кошельков и транзакций.

Необходимо найти пользователей, у которых последняя транзакция была в октябре 2018 г., и в деталях данной транзакции прописано значение Users.ManagerId.

Написал запрос с WHERE EXISTS, но не знаю, как добавить условие, что после октября 2018 не было транзакций. Подскажите пожалуйста, как можно оптимизировать, или лучше вообще по какой-то другой структуре запрос оставлять..?
Также предполагаю, что диапазон дат в формате '2018-10-01 00:00:00' можно как-то попроще указать, ориентируюсь на формат Transactions.CreationDate - datetime.
SELECT
   UserID 
FROM
   Users 
WHERE
   EXISTS 
   (
      SELECT
         TransactionID 
      FROM
         Transactions 
      WHERE
         Transactions.Detail = Users.ManagerId 
         AND Transactions.CreationDate BETWEEN '2018-10-01 00:00:00' AND '2018-10-31 23:59:59'
   )
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
SELECT Users.UserID, Users.ManagerId
FROM Users 
    INNER JOIN Wallets ON Users.UserID = Wallets.UserID 
    INNER JOIN WalletSections ON Wallets.WalletID = WalletSections.WalletID 
    INNER JOIN Transactions ON WalletSections.WalletSectionID = Transactions.WalletSectionID
  GROUP BY Users.UserID, Users.ManagerId
  HAVING (MAX(Transactions.CreationDate) BETWEEN '2018-10-01 00:00:00' AND '2018-10-31 23:59:59')


и в деталях данной транзакции прописано значение Users.ManagerId.

SELECT Users.UserID
FROM Users 
    INNER JOIN Wallets ON Users.UserID = Wallets.UserID 
    INNER JOIN WalletSections ON Wallets.WalletID = WalletSections.WalletID 
    INNER JOIN Transactions ON WalletSections.WalletSectionID = Transactions.WalletSectionID
  WHERE (Transactions.Detail = Users.ManagerId)
  GROUP BY Users.UserID
  HAVING (MAX(Transactions.CreationDate) BETWEEN '2018-10-01 00:00:00' AND '2018-10-31 23:59:59')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Можно вот так попробовать:
SELECT Users.UserID 
  FROM Transactions   
  JOIN Users
    on Users.ManagerId = Transactions.Detail
 GROUP BY Users.UserID 
HAVING MAX(Transactions.CreationDate) < '2018-11-01'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы