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
我想要一个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
所以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
编辑:以下是核心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)
SELECT * FROM 
#TEMP T1 WHERE TIME=
(SELECT MAX(TIME) FROM #TEMP T2
WHERE T1.NAME=T2.NAME AND T2.SUBNAME=T1.SUBNAME)
输出:
Name    SubName Message Time
USA       WA    M5       5
USA       NY    M6       6
USA       MA    M4       4
FIN       TAM   M8       8
FIN       HEl   M9       9