让我们假设下表:
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
所以是ORDER BY time DESC
,它按不同的名称分组,并按不同的子名称进行子分组。
这可能吗?我正在寻找一种不是DBMS特定的解决方案 - 可以在大多数DBMS中运行。
答案 0 :(得分:6)
您没有标记您的RDBMS,因此对于适用于大多数RDBMS的 <input class="btn btn-action btn-save" type="submit">Save</input>
,您可以使用ANSI-SQL
:
ROW_NUMBER()
编辑:以下是核心ANSI SQL的答案,该答案适用于您可以使用的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
的任何数据库:
NOT EXISTS()
答案 1 :(得分:5)
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
答案 2 :(得分:4)
如果您的dbms不支持ANSI SQL的扩展T611,则初级OLAP操作:
select t1.*
from tablename t1
join (select name, subname, max(Time) maxtime
from tablename
group by name, subname)
on t1.name = t2.name and
t1.subname = t2.subname and
t1.time= t2.maxtime
order by name, subname, time desc
使用Core SQL-2003之外的以下功能:F591,“派生表”
请注意,ANSI SQL将time
作为保留字,因此您可能需要将其分隔为"time"
。
答案 3 :(得分:3)
您可以分两步完成此操作。首先为每个name
/ subname
组合选择最佳。然后订购它们。在大多数数据库中,您可以使用row_number()
作为第一部分:
select t.*
from (select t.*,
row_number() over (partition by t.name, t.subname order by time desc) as seqnum
from t
) t
order by time desc;
答案 4 :(得分:3)
可以使用 ROW_NUMBER()和WHERE s.rank = 1
来获取分区制作的每个组中的第一条记录:
SELECT s.Name,s.SubName,s.Message, s.Time
FROM (
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.Name, t.SubName ORDER BY t.Time DESC) as rank
FROM YourTable t) s
WHERE s.rank = 1
ORDER BY s.Time DESC
答案 5 :(得分:1)
我没有对此进行过测试,但我认为这应该可行:
select
t1.name as name,
t1.subname as subname,
(select max(t2.message) from table t2 where t2.name = t1.name and t2.subname = t1.subname) as message,
(select max(t2.time) from table t2 where t2.name = t1.name and t2.subname = t1.subname) as time
from
table t1
group by
t1.name,
t1.subname
order by
t1.name