下面是原始的MySQL语句:
select transactions.username,
count(transactions.username) as total_transactions,
last_device,
last_transaction
from transactions
inner join (select username,
terminal as last_device,
request_date as last_transaction
from transactions t1
where request_date =
(select max(request_date)
from transactions t2
where t1.username = t2.username)) as transactions_per_user
on transactions_per_user.username = transactions.username
group by username;Oracle不喜欢这一说法,因此,经过多次尝试和错误之后,我将其改写为:
select transactions_per_user.username,
count(transactions_per_user.username) as total_transactions,
MAX(transactions_per_user.last_transaction) as last_transaction,
MAX(transactions_per_user.last_device) as last_device
from
transactions
inner join
(
select username, terminal as last_device, request_date as last_transaction
from transactions t1
where request_date = (select max(request_date)
from transactions t2 where t1.username=t2.username)
)
transactions_per_user on transactions_per_user.username=transactions.username
group by transactions_per_user.username;这似乎是正确的事情,但我关心的是使用麦克斯在那里。我不太明白它为什么会起作用。如果不帮我写一条能在oracle中工作的语句来接近mysql,那么谁能验证它是可以的吗?如果sql同时在oracle和mysql中运行,那就更好了。
基本上,我试图生成一个按用户分组的表,其中列出了他们的最后一个事务日期、最后一个使用的设备以及他们所做的事务计数。
发布于 2015-06-24 08:42:13
我使用PL/SQL对相同格式的语句进行格式化,并使用TortuiseSVN dif对它们进行比较。
第一个查询:
SELECT transactions.username,
COUNT(transactions.username) AS total_transactions,
last_device,
last_transaction
FROM transactions
INNER JOIN (SELECT username,
terminal AS last_device,
request_date AS last_transaction
FROM transactions t1
WHERE request_date =
(SELECT MAX(request_date)
FROM transactions t2
WHERE t1.username = t2.username)) AS transactions_per_user
ON transactions_per_user.username = transactions.username
GROUP BY username第二个查询:
SELECT transactions_per_user.username,
COUNT(transactions_per_user.username) AS total_transactions,
MAX(transactions_per_user.last_transaction) AS last_transaction,
MAX(transactions_per_user.last_device) AS last_device
FROM transactions
INNER JOIN (SELECT username,
terminal AS last_device,
request_date AS last_transaction
FROM transactions t1
WHERE request_date =
(SELECT MAX(request_date)
FROM transactions t2
WHERE t1.username = t2.username)) transactions_per_user
ON transactions_per_user.username = transactions.username
GROUP BY transactions_per_user.username;以下是一些变化:
https://stackoverflow.com/questions/31019922
复制相似问题