Я новичок в SQL и собираюсь написать запрос для идентификации пользователей, чья первая транзакция была успешной картой сверх эквивалентной стоимости 10 USD (суммы указаны в разных валютах). Это теоретическое упражнение, при котором у меня есть базы данных в Excel, но в настоящее время я не могу получить доступ к каким-либо SQL-серверам для проверки этого запроса.
Во-первых, Я определил результирующий набор следующим образом:
SELECT t.user_id, min(t.created_date), (t.amount / fx.rate / Power (10, cd.exponent) AS amount)
FROM transactions AS t
Это должно привести к идентификатору пользователя, самой ранней дате транзакции и сумме транзакции в долларах США (исходная транзакция конвертируется в доллары США и конвертируется в денежную сумму из целой суммы).
Довольно комфортно с последней формулой, просто хочу убедиться, что ссылка ниже правильно возвращает fx.rate и cd.exponent, чтобы он мог действительно работать:
JOIN fx_rates AS fx
ON ( fx.ccy = t.currency
AND fx.base_ccy = 'USD' )
JOIN currency_details AS cd
ON cd.currency = t.currency
Приведенное выше должно обеспечить, чтобы в столбце «сумма» были все ссылки, необходимые для расчета.
Наконец Я хочу применить набор ограничений, поэтому данные включают только заполненоплатежи по карте на сумму более 10 долларов США :
WHERE t.type='card_payment'
AND t.state='completed'
AND amount>=10
Это хитрый момент, поскольку я прочитал, что вы не можете ссылаться на псевдоним («количество»), так как он на самом деле отсутствует в наборе результатов, ноне уверен, что это применимо здесь.
У меня есть два вопроса:
1) Будет ли этот запрос производить список первых транзакций, которые были более 10USD? Я не хочу, чтобы он узнал, когда / если транзакция достигла этого порога. Меня интересует только первая транзакция для каждого пользователя. Если ответ «нет», лучше ли мне создавать таблицу с первыми транзакциями и фильтровать ее? Честно говоря, я думал, что это то, что я делаю здесь.
2) Допустима ли ссылка на псевдоним «количество» в запросе? Если нет, требуется ли здесь другой SELECT?
Полный запрос
SELECT t.user_id, min(t.created_date), (t.amount / fx.rate / Power (10, cd.exponent) AS amount)
FROM transactions AS t
JOIN fx_rates AS fx
ON ( fx.ccy = t.currency
AND fx.base_ccy = 'USD' )
JOIN currency_details AS cd
ON cd.currency = t.currency
WHERE t.type='card_payment'
AND t.state='completed'
AND amount>=10
------- ОБНОВЛЕНИЕ 1 -------
После многочисленных комментариев и ответов обновленный запрос выглядит следующим образом:
SELECT t.user_id, t.created_date,
(t.amount / fx.rate / Power(10, cd.exponent)) AS amount
FROM (
SELECT *, Row_Number () OVER
(PARTITION BY t.user_id ORDER BY t.created_date) AS RowNum
FROM transactions AS t)
JOIN fx_rates fx
ON ( fx.ccy = t.currency
AND fx.base_ccy = ‘USD')
JOIN currency_details cd
ON cd.currency = t.currency
WHERE RowNum = 1
AND t.type = ‘card_payment‘
AND t.state = ‘completed‘
AND (t.amount / fx.rate / Power(10, cd.exponent)) >= 10
GROUP BY t.user_id;