我的table是:
id home datetime player resource
---|-----|------------|--------|---------
1 | 10 | 04/03/2009 | john | 399
2 | 11 | 04/03/2009 | juliet | 244
5 | 12 | 04/03/2009 | borat | 555
3 | 10 | 03/03/2009 | john | 300
4 | 11 | 03/03/2009 | juliet | 200
6 | 12 | 03/03/2009 | borat | 500
7 | 13 | 24/12/2008 | borat | 600
8 | 13 | 01/01/2009 | borat | 700
我需要选择每个不同的 home
保持最大值 datetime
.
结果是:
id home datetime player resource
---|-----|------------|--------|---------
1 | 10 | 04/03/2009 | john | 399
2 | 11 | 04/03/2009 | juliet | 244
5 | 12 | 04/03/2009 | borat | 555
8 | 13 | 01/01/2009 | borat | 700
我试过:
-- 1 ..by the MySQL manual:
SELECT DISTINCT
home,
id,
datetime AS dt,
player,
resource
FROM topten t1
WHERE datetime = (SELECT
MAX(t2.datetime)
FROM topten t2
GROUP BY home)
GROUP BY datetime
ORDER BY datetime DESC
不起作用。结果集有130行,但数据库有187行。结果包括的一些副本 home
.
-- 2 ..join
SELECT
s1.id,
s1.home,
s1.datetime,
s1.player,
s1.resource
FROM topten s1
JOIN (SELECT
id,
MAX(datetime) AS dt
FROM topten
GROUP BY id) AS s2
ON s1.id = s2.id
ORDER BY datetime
不。提供所有记录。
-- 3 ..something exotic:
结果各不相同。
19条答案
按热度按时间rvpgvaaj1#
即使每个行有两行或更多行,也可以这样做
home
具有相等的DATETIME
的:sg3maiej2#
eit6fx6z3#
另一种方法是使用子查询对每个组最近的行进行gt,子查询基本上为每个组的每一行计算一个秩,然后过滤出最近的行,如秩=1
演示
为了更好地理解,下面是每一行的rank no的可视化演示
通过阅读一些注解,如果有两行具有相同的“home”和“datetime”字段值,该怎么办?
对于上述情况,上述查询将失败并返回超过1行。为了掩盖这种情况,需要另一个标准/参数/列来决定应该采取哪一行哪一行属于上述情况。通过查看示例数据集,我假设有一个主键列
id
应该设置为自动递增。因此,我们可以使用此列通过在CASE
陈述式演示
上面的查询将在同一行中选取id最高的行
datetime
价值观每行排名的视觉演示
1cklez4t4#
既然人们似乎一直在碰到这样的主题(评论日期从1.5年开始),那就不是这么简单了:
SELECT * FROM (SELECT * FROM topten ORDER BY datetime DESC) tmp GROUP BY home
不需要聚合函数。。。干杯。
62lalag45#
对于sql server,请尝试以下操作:
yh2wf1be6#
这是您需要的查询:
laximzn57#
最快的
MySQL
解决方案,没有内部查询和GROUP BY
:说明:
使用
home
列。使用LEFT JOIN
确保表中的所有行m
出现在结果集中。那些table上没有匹配的b
会有NULL
s代表b
.另一个条件是
JOIN
要求只匹配中的行b
在市场上有更大的价值datetime
列中的行m
.根据问题中公布的数据
LEFT JOIN
将产生这对:最后是
WHERE
子句只保留具有NULL
在…的列中b
(它们标有*
(见上表);这意味着,由于JOIN
子句中选择的行m
列中的值最大datetime
.阅读《sql反模式:避免数据库编程的陷阱》一书中的其他sql技巧。
v09wglhw8#
您也可以尝试这个方法,对于大型表,查询性能会更好。当每个家庭的记录不超过两个,并且日期不同时,它就起作用了。更好的通用mysql查询来自上面的michaellavoie。
如果是postgres或那些提供分析功能的数据库,请尝试
8tntrjer9#
(注:对于目标列
datetime
每个不同的值不能有重复的值home
.)如果表中有重复的行
home
十datetime
您只需要为每个不同的行选择一行home
专栏,下面是我的解决方案:您的表需要一个唯一的列(如
id
). 如果没有,则创建一个视图并向其中添加一个随机列。使用此查询为每个唯一项选择一行
home
价值观。选择最低的id
如有重复datetime
.des4xlb010#
sc4hvdpw11#
这适用于oracle:
0tdrvxhp12#
为什么不使用:选择home,max(datetime)作为maxdatetime,player,resource from topten group by home我错过什么了吗?
mqkwyuun13#
你太接近了!你所需要做的就是选择家和它的最大日期时间,然后加入回到
topten
两个字段上的表:zvokhttg14#
t-sql版本如下:
编辑
不幸的是,mysql中没有rank()over函数。
但是它可以被模拟,请参阅用mysql模拟分析(aka ranking)函数。
这是mysql版本:
evrscar215#
我想这会给你想要的结果:
但是如果您还需要其他列,只需与原始表建立一个连接(检查
Michael La Voie
答案)致以最诚挚的问候。