У меня есть таблица с сделок:SQL: Выберите операции, где строки не являются критериев внутри одной и той же таблицы
Transactions
------------
id | account | type | date_time | amount
----------------------------------------------------
1 | 001 | 'R' | '2012-01-01 10:01:00' | 1000
2 | 003 | 'R' | '2012-01-02 12:53:10' | 1500
3 | 003 | 'A' | '2012-01-03 13:10:01' | -1500
4 | 002 | 'R' | '2012-01-03 17:56:00' | 2000
5 | 001 | 'R' | '2012-01-04 12:30:01' | 1000
6 | 002 | 'A' | '2012-01-04 13:23:01' | -2000
7 | 003 | 'R' | '2012-01-04 15:13:10' | 3000
8 | 003 | 'R' | '2012-01-05 12:12:00' | 1250
9 | 003 | 'A' | '2012-01-06 17:24:01' | -1250
, и я хочу, чтобы выбрать все определенного типа («R»), а не те, что немедленно (в порядке убывания поля дата_время) имеют другую сделку другого типа («А») на тот же счет, поданном ...
Таким образом, запрос должен выбросить следующие строки, учитывая предыдущий пример:
id | account |type | date | amount
----------------------------------------------------
1 | 001 | 'R' | '2012-01-01 10:01:00' | 1000
5 | 001 | 'R' | '2012-01-04 12:30:01' | 1000
7 | 003 | 'R' | '2012-01-04 15:13:10' | 3000
(Как вы можете видеть, строка 2 не отображается, потому что строка 3 «отменяет» ее ... также строка 4 отменяется по строке 6 '; Появится строка 7 (хотя учетная запись 003 принадлежит к отмененной строке №2, на этот раз в строке 7 она не отменяется ни одной строкой «А»); И строка 8 не появится (это тоже для учетной записи 003, так как теперь она отменяется на 9, что также не отменяет 7: только 8: 0 ...
Я пробовал Соединения, подзапросы в Где пункты, но я действительно не знаю, как я должен сделать мой запрос ...
То, что я пробовал:
Попытка присоединяется:
SELECT trans.type as type,
trans.amount as amount,
trans.date_time as dt,
trans.account as acct,
FROM Transactions trans
INNER JOIN (SELECT t.type AS type, t.acct AS acct, t.date_time AS date_time
FROM Transactions t
WHERE t.date_time > trans.date_time
ORDER BY t.date_time DESC
) AS nextTrans
ON nextTrans.acct = trans.acct
WHERE trans.type IN ('R')
AND nextTrans.type NOT IN ('A')
ORDER BY DATE(trans.date_time) ASC
Это выдает ошибку, так как я могу Внедрить внешние значения в JOIN в MySQL.
Попытка подзапрос в том, где:
SELECT trans.type as type,
trans.amount as amount,
trans.date_time as dt,
trans.account as acct,
FROM Transactions trans
WHERE trans.type IN ('R')
AND trans.datetime <
(SELECT t.date_time AS date_time
FROM Transactions t
WHERE t.account = trans.account
ORDER BY t.date_time DESC
) AS nextTrans
ON nextTrans.acct = trans.acct
ORDER BY DATE(trans.date_time) ASC
Это неправильно, я могу ввести внешние значения в WHERE в MySQL, но я не могу управлять, чтобы найти способ, чтобы правильно фильтровать для того, что мне нужно ...
ВАЖНЫЙ РЕДАКТИРОВАНИЕ:
Мне удалось найти решение, но теперь оно нуждается в серьезной оптимизации. Вот он:
SELECT *
FROM (SELECT t1.*, tFlagged.id AS cancId, tFlagged.type AS cancFlag
FROM transactions t1
LEFT JOIN (SELECT t2.*
FROM transactions t2
ORDER BY t2.date_time ASC) tFlagged
ON (t1.account=tFlagged.account
AND
t1.date_time < tFlagged.date_time)
WHERE t1.type = 'R'
GROUP BY t1.id) tCanc
WHERE tCanc.cancFlag IS NULL
OR tCanc.cancFlag <> 'A'
Я присоединился к таблице с собой, просто учитывая тот же аккаунт и отличную дату. Присоединение отправляется по дате_time. Группировка по id Мне удалось получить только первый результат соединения, который является следующей транзакцией для той же учетной записи.
Затем на внешнем элементе я отфильтровываю те, у которых есть «А», так как это означает, что следующая транзакция была фактически отменена для него. Другими словами, если для одной и той же учетной записи нет следующей транзакции или если следующая транзакция является «R», то она не отменяется, и она должна быть указана в результате ...
Я получил это:
+----+---------+------+---------------------+--------+--------+----------+
| id | account | type | date_time | amount | cancId | cancFlag |
+----+---------+------+---------------------+--------+--------+----------+
| 1 | 001 | R | 2012-01-01 10:01:00 | 1000 | 5 | R |
| 5 | 001 | R | 2012-01-04 12:30:01 | 1000 | NULL | NULL |
| 7 | 003 | R | 2012-01-04 15:13:10 | 3000 | 8 | R |
+----+---------+------+---------------------+--------+--------+----------+
Он связывает каждую транзакцию со следующей за той же учетной записью, а затем отфильтровывает те, которые были отменены ... Успех!
Как я уже сказал, проблема теперь в оптимизации. У моих реальных данных много строк (как ожидается, будет отображаться таблица с транзакциями во времени), а для таблицы размером ~ 10 000 строк я получил положительный результат с этим запросом в 1мин.44 сек. Я полагаю, что это связано с присоединением ... (Для тех, кто знает протокол здесь, что мне делать? Запустите здесь новый вопрос и опубликуйте это как решение для этого?? Или просто ждать больше ответов здесь)
Опубликовать то, что вы пробовали. –
там это ... –
Смотрите: http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –