Ahm*_*taq 12 sql database-agnostic
让我们假设下表:
Name SubName Message Time
USA MA M1 1
USA NY M2 2
USA WA M3 3
USA MA M4 4
USA WA M5 5
USA NY M6 6
FIN HEL M7 7
FIN TAM M8 8
FIN HEL M9 9
Run Code Online (Sandbox Code Playgroud)
我想要一个SQL查询,它将返回以下内容:
Name SubName Message Time
FIN HEL M9 9
FIN TAM M8 8
USA NY M6 6
USA WA M5 5
USA MA M4 4
Run Code Online (Sandbox Code Playgroud)
所以a ORDER BY time DESC,按不同的名称分组,并按不同的子名称分组.
这可能吗?我正在寻找一种不是DBMS特定的解决方案 - 可以在大多数DBMS中运行.
您没有标记您的RDBMS,因此对于ANSI-SQL大多数RDBMS,您可以使用它ROW_NUMBER():
SELECT s.* FROM (
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.name,t.subname ORDER BY t.time DESC) as rnk
FROM YourTable
) s
WHERE s.rnk = 1
ORDER BY s.time DESC,s.name
Run Code Online (Sandbox Code Playgroud)
编辑:以下是核心ANSI SQL的答案,它应该适用于您可以使用的任何数据库NOT EXISTS():
SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
WHERE t.name = s.name and t.subname = s.subname
AND s.time > t.time)
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM
#TEMP T1 WHERE TIME=
(SELECT MAX(TIME) FROM #TEMP T2
WHERE T1.NAME=T2.NAME AND T2.SUBNAME=T1.SUBNAME)
Run Code Online (Sandbox Code Playgroud)
输出:
Name SubName Message Time
USA WA M5 5
USA NY M6 6
USA MA M4 4
FIN TAM M8 8
FIN HEl M9 9
Run Code Online (Sandbox Code Playgroud)