我正在尝试从金额最大的支付表中获取“日期”和“访客ID”。我知道如何按每个日期查找最大值,但无法获取具有最大值的Date和VisitorID。
我尝试使用下面的附加代码,但我只得到一个具有最大值的值。我正在尝试获取每天的日期和访客ID,且金额最大。
SELECT Date, visitorID
FROM payment
WHERE Amount =
(
SELECT MAX(Amount)
FROM payment
)
答案 0 :(得分:1)
您可以尝试使用相关子查询
SELECT Date, visitorID,amount
FROM payment a
WHERE exists
(
SELECT 1
FROM payment b where a.date=b.date group by b.date having max(b.amount)=a.amount
)
答案 1 :(得分:0)
看到您的评论后,您似乎需要row_number()
with cte as
(
SELECT *,row_number() over(partition by date order by amount desc)rn
from payment t1
) select * from cte where cte.rn=1
答案 2 :(得分:0)
一个选项使用子查询:
SELECT p1.Date, p1.visitorID
FROM payment p1
INNER JOIN
(
SELECT Date, MAX(Amount) AS max_amount
FROM payment
GROUP BY Date
) p2
ON p1.Date = p2.Date AND p1.Amount = p2.max_amount;
子查询查找每个日期的最大金额。然后,我们将其加入到您的原始表中,以有效过滤掉给定日期中 not 没有最大金额的任何记录。
如果您的SQL版本支持解析功能,那么我们可以改用它们:
SELECT Date, visitorID
FROM
(
SELECT p.*, ROW_NUMBER() OVER (PARTITION BY Date ORDER BY Amount DESC) rn
FROM payment p
) t
WHERE rn = 1;
如果您还希望获得给定日期的所有记录并列最高金额,则用ROW_NUMBER
或RANK
替换上面的DENSE_RANK
。
答案 3 :(得分:0)
您很亲密,需要outerquery
的引用才能使其与subquery
相关:
SELECT p.Date, p.visitorID
FROM payment p
WHERE p.Amount = (SELECT MAX(p1.Amount) FROM payment p1 WHERE p1.Date = p.Date);