表:
UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)
我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)
更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.
我很难在没有搜索同一个表至少两次以获取最大行的情况下执行此操作,然后获取该行的值.有问题的表格很大,所以这是不可接受的.
这是我的表可能是这样的:
SCORES
ID ROUND SCORE
1 1 3
1 2 6
1 3 2
2 1 10
2 2 12
3 1 6
Run Code Online (Sandbox Code Playgroud)
我需要返回每个ID在最近一轮中获得的分数.也就是说,行具有最大(圆形),但不是最大分数.
OUTPUT:
ID ROUND SCORE
1 3 2
2 2 12
3 1 6
Run Code Online (Sandbox Code Playgroud)
现在我有:
SELECT * FROM
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
FROM
SCORES
where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但效率很低(我必须手动过滤掉所有这些行,当我应该首先不能抓住那些行时.)
我能做些什么来获得正确的价值观?
我有一个名为departments的表,其中包含一个名为salary的列.现在我想了解每个部门最高两个薪水的所有细节.我们应该如何开发一个产生所需输出的查询?前N个分析将作为一个整体给出,但不是每个部门.我想要每个部门的前两名.
如果我有一个名为FAVORITE_FLAVOR的数据库表,其中每一行都有用户最喜欢的冰淇淋口味.
User ID | Flavor | State
1 | Chocolate | CA
2 | Vanilla | ND
3 | Chocolate | CA
4 | Rocky Road | CA
5 | vanilla | CA
6 | Vanilla | CA
7 | Vanilla | CA
Run Code Online (Sandbox Code Playgroud)
现在,如果我想查询每个州最流行的2种口味(规范化大小写和空格),我可以查询:
SELECT state, INITCAP(TRIM(flavor)), count(INITCAP(TRIM(flavor))) AS total
FROM favorite_flavor GROUP BY state, INITCAP(TRIM(flavor))
ORDER BY state ASC, total DESC;
Run Code Online (Sandbox Code Playgroud)
哪个回报:
CA | Vanilla | 3
CA | Chocolate | 2
CA | Rocky Road | 1
ND …Run Code Online (Sandbox Code Playgroud) sql oracle aggregate-functions oracle10g greatest-n-per-group