求最大的一行 关于 max

红衣老大 2014-03-13 02:27:00
SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName FROM A INNER JOIN B ON A.ConfirmationCodeID = B.id INNER JOIN C ON B.CourseID = C.id

OverdueDate 是日期行

结果会有 多行

求 在 CourseName相同的时候 只保留最大OverdueDate的 那行


问题是 我直接使用 max(OverdueDate) 没有效果


请指教
...全文
209 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2014-03-14
  • 打赏
  • 举报
回复
引用 20 楼 xiaobingking 的回复:
我理解 就是先查询 顺便 生成一个 rownum 重点 是生成的时候 按照 CourseName 分组 OverdueDate desc 排序 然后 挑选上边结果 rownum = 1 的
呵呵,你的理解是对的,就是这个意思,先分组,对每个分组,按照日期降序排列,取第一个就行
LongRui888 2014-03-14
  • 打赏
  • 举报
回复
引用 19 楼 xiaobingking 的回复:
[quote=引用 18 楼 yupeigu 的回复:] [quote=引用 17 楼 xiaobingking 的回复:] 如果是简单的 MAX(OverdueDate) GROUP BY ConfirmationCodeID, CourseName 就好办了 但现在只能 MAX(OverdueDate) GROUP BY CourseName 造成 ConfirmationCodeID 没地方 放了
试试这个:
select ConfirmationCodeID, OverdueDate, CourseName
from
(
SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName ,
       ROW_NUMBER() over(partition by CourseName order by OverdueDate desc) rownum
FROM A INNER 
JOIN B ON A.ConfirmationCodeID = B.id 
INNER JOIN C ON B.CourseID = C.id
where v = 26
)t
where rownum = 1
[/quote] 多谢 这个 是我需要的 能不能 简单介绍一下 另外 ROW_NUMBER() over 有没有版本要求[/quote] 2005及以上的都能用的,2000好像不能用
红衣老大 2014-03-14
  • 打赏
  • 举报
回复
我理解 就是先查询 顺便 生成一个 rownum 重点 是生成的时候 按照 CourseName 分组 OverdueDate desc 排序 然后 挑选上边结果 rownum = 1 的
红衣老大 2014-03-14
  • 打赏
  • 举报
回复
引用 18 楼 yupeigu 的回复:
[quote=引用 17 楼 xiaobingking 的回复:] 如果是简单的 MAX(OverdueDate) GROUP BY ConfirmationCodeID, CourseName 就好办了 但现在只能 MAX(OverdueDate) GROUP BY CourseName 造成 ConfirmationCodeID 没地方 放了
试试这个:
select ConfirmationCodeID, OverdueDate, CourseName
from
(
SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName ,
       ROW_NUMBER() over(partition by CourseName order by OverdueDate desc) rownum
FROM A INNER 
JOIN B ON A.ConfirmationCodeID = B.id 
INNER JOIN C ON B.CourseID = C.id
where v = 26
)t
where rownum = 1
[/quote] 多谢 这个 是我需要的 能不能 简单介绍一下 另外 ROW_NUMBER() over 有没有版本要求
LongRui888 2014-03-13
  • 打赏
  • 举报
回复
引用 17 楼 xiaobingking 的回复:
如果是简单的 MAX(OverdueDate) GROUP BY ConfirmationCodeID, CourseName 就好办了 但现在只能 MAX(OverdueDate) GROUP BY CourseName 造成 ConfirmationCodeID 没地方 放了
试试这个:
select ConfirmationCodeID, OverdueDate, CourseName
from
(
SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName ,
       ROW_NUMBER() over(partition by CourseName order by OverdueDate desc) rownum
FROM A INNER 
JOIN B ON A.ConfirmationCodeID = B.id 
INNER JOIN C ON B.CourseID = C.id
where v = 26
)t
where rownum = 1
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
如果是简单的 MAX(OverdueDate) GROUP BY ConfirmationCodeID, CourseName 就好办了 但现在只能 MAX(OverdueDate) GROUP BY CourseName 造成 ConfirmationCodeID 没地方 放了
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
原来是图也不行 做不出来
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
引用 9 楼 wufeng4552 的回复:
SELECT A.ConfirmationCodeID, 
              B.OverdueDate,
             C.CourseName 
FROM A INNER JOIN (select max(OverdueDate)OverdueDate,id
                                    from b
                                    group by id)B ON A.ConfirmationCodeID = B.id 
 INNER JOIN C ON B.CourseID = C.id
这个 我不知道 where V 放在那里啊
水族杰纶 2014-03-13
  • 打赏
  • 举报
回复
引用 13 楼 xiaobingking 的回复:
实在不行 我只能用视图了
9#试没
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
实在不行 我只能用视图了
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
引用 10 楼 hwu14 的回复:
WITH STAGING (ConfirmationCodeID, OverdueDate,CourseName,Rank ) AS ( SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName , RANK() OVER (PARTITION BY C.CourseName ORDER BY B.OverdueDate desc) AS Rank FROM A INNER JOIN B ON A.ConfirmationCodeID = B.ConfirmationCodeID INNER JOIN C ON B.CourseID = C.CourseID ) SELECT * FROM STAGING WHERE RANK = 1 AND A.v=26 请指教
这个我怎么用 /? 插不到 代码里去吧
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
引用 8 楼 fredrickhu 的回复:
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2014-03-13 15:31:04
-- Verstion:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
--	Jul  9 2008 14:43:34 
--	Copyright (c) 1988-2008 Microsoft Corporation
--	Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([ConfirmationCodeID] int,[OverdueDate] int,[CourseName] varchar(4))
insert [tb]
select 1,2011,'数学' union all
select 3,2014,'数学' union all
select 4,2011,'语文'
--------------开始查询--------------------------

select * from [tb] t WHERE OverdueDate=(SELECT MAX(OverdueDate) FROM TB WHERE CourseName=t.CourseName)

SELECT * FROM TB t WHERE NOT EXISTS(SELECT 1 FROM TB WHERE CourseName=t.CourseName AND OverdueDate>t.OverdueDate)
----------------结果----------------------------
/* ConfirmationCodeID OverdueDate CourseName
------------------ ----------- ----------
3                  2014        数学
4                  2011        语文

*/
自己去修改一下吧。
大哥 真没改出来
HeavenInShanghai 2014-03-13
  • 打赏
  • 举报
回复
WITH STAGING (ConfirmationCodeID, OverdueDate,CourseName,Rank ) AS ( SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName , RANK() OVER (PARTITION BY C.CourseName ORDER BY B.OverdueDate desc) AS Rank FROM A INNER JOIN B ON A.ConfirmationCodeID = B.ConfirmationCodeID INNER JOIN C ON B.CourseID = C.CourseID ) SELECT * FROM STAGING WHERE RANK = 1 AND A.v=26 请指教
水族杰纶 2014-03-13
  • 打赏
  • 举报
回复
SELECT A.ConfirmationCodeID, 
              B.OverdueDate,
             C.CourseName 
FROM A INNER JOIN (select max(OverdueDate)OverdueDate,id
                                    from b
                                    group by id)B ON A.ConfirmationCodeID = B.id 
 INNER JOIN C ON B.CourseID = C.id
--小F-- 2014-03-13
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2014-03-13 15:31:04
-- Verstion:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
--	Jul  9 2008 14:43:34 
--	Copyright (c) 1988-2008 Microsoft Corporation
--	Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([ConfirmationCodeID] int,[OverdueDate] int,[CourseName] varchar(4))
insert [tb]
select 1,2011,'数学' union all
select 3,2014,'数学' union all
select 4,2011,'语文'
--------------开始查询--------------------------

select * from [tb] t WHERE OverdueDate=(SELECT MAX(OverdueDate) FROM TB WHERE CourseName=t.CourseName)

SELECT * FROM TB t WHERE NOT EXISTS(SELECT 1 FROM TB WHERE CourseName=t.CourseName AND OverdueDate>t.OverdueDate)
----------------结果----------------------------
/* ConfirmationCodeID OverdueDate CourseName
------------------ ----------- ----------
3                  2014        数学
4                  2011        语文

*/
自己去修改一下吧。
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
V 是 A标的
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
引用 5 楼 fredrickhu 的回复:
V是哪个表的字段?直接加上。

SELECT
    A.ConfirmationCodeID, B.OverdueDate, C.CourseName
FROM
    A
INNER JOIN B ON A.ConfirmationCodeID=B.id   --如果是A表或者B表的 加这里 and a.v=26
INNER JOIN C ON B.CourseID=C.id
WHERE
	B.OverdueDate=(SELECT MAX(OverdueDate) FROM b AS t WHERE ConfirmationCodeID=b.ConfirmationCodeID)
不行 少了很多 ,可能是我说的不准确 原来 结果是 ConfirmationCodeID OverdueDate CourseName 1 2011 数学 3 2014 数学 4 2011 语文 我希望的结果 ConfirmationCodeID OverdueDate CourseName 3 2014 数学 4 2011 语文 原来 第1 2 行 对比 时间后 取大的
--小F-- 2014-03-13
  • 打赏
  • 举报
回复
V是哪个表的字段?直接加上。

SELECT
    A.ConfirmationCodeID, B.OverdueDate, C.CourseName
FROM
    A
INNER JOIN B ON A.ConfirmationCodeID=B.id   --如果是A表或者B表的 加这里 and a.v=26
INNER JOIN C ON B.CourseID=C.id
WHERE
	B.OverdueDate=(SELECT MAX(OverdueDate) FROM b AS t WHERE ConfirmationCodeID=b.ConfirmationCodeID)
红衣老大 2014-03-13
  • 打赏
  • 举报
回复
二位 本来我还有 where V=26 的条件,没写 加上怎么做?
LongRui888 2014-03-13
  • 打赏
  • 举报
回复
修改一下:
select ConfirmationCodeID, OverdueDate, CourseName
from
(
SELECT A.ConfirmationCodeID, B.OverdueDate, C.CourseName ,
       ROW_NUMBER() over(partition by C.CourseName order by B.OverdueDate desc) rownum
FROM A INNER 
JOIN B ON A.ConfirmationCodeID = B.id 
INNER JOIN C ON B.CourseID = C.id
)t
where rownum = 1
加载更多回复(2)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧