[求助] 菜鸟求救

[复制链接]
查看11 | 回复7 | 2008-1-21 16:50:24 | 显示全部楼层 |阅读模式
本人是菜鸟,想问各位大侠个问题:
tbl中有a,b,c三个字段组成主key,还有一个字段d,每个d的值可能对应不同的a,b,c。现在想把每个d对应的纪录中的某一条取出来,这条纪录满足:
首先比较a,取出a最大的那条纪录,如果这样的纪录不只一条,再比较b,取出b最大的那条纪录,如果这样的纪录还是不只一条,再比较c,最后取出的纪录肯定只有一条。
小弟在线等你回复。谢了先。
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
select a, b, c, d from(
select a, b, c, d, row_number() over(partition by d order by a desc, b desc, c desc) rn
from tbl
) where rn = 1;
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
谢谢 Laurence.li 的帮助。
不是很清楚row_number() over(partition by d order by a desc, b desc, c desc) 有人能帮忙解释下吗?
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
语法
ROW_NUMBER ( ) OVER ( [])参数

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。
有关详细信息,请参阅 OVER 子句 (Transact-SQL)。
备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
返回类型
bigint
示例
以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD0以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
最初由 dell0923 发布
[B]本人是菜鸟,想问各位大侠个问题:
tbl中有a,b,c三个字段组成主key,还有一个字段d,每个d的值可能对应不同的a,b,c。现在想把每个d对应的纪录中的某一条取出来,这条纪录满足:
首先比较a,取出a最大的那条纪录,如果这样的纪录不只一条,再比较b,取出b最大的那条纪录,如果这样的纪录还是不只一条,再比较c,最后取出的纪录肯定只有一条。
小弟在线等你回复。谢了先。 [/B]

描述不准确,给个实例说明一下?
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
已经解决了 谢谢各位大侠的帮助。
问题再描述如下:
table:MFET_DNPY_HD (DNPY_YMD,DNPY_KBN,DNPY_NO,SJ_NO)
todo:将每个SJ_NO(非主key)对应许多DNPY_YMD,DNPY_KBN,DNPY_NO(三个组成主key)的组合中,DNPY_YMD,DNPY_KBN,DNPY_NO依次最大的那条数据取出来。
当然,实际中还有其他的要求,在得到大家的帮助以后,已经完成了。再次感谢大家的帮助。
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
看看分析函数的描述就明白了,那里面说的很详细
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
用伪列(rownum)查询嘛,where条件为rownum=1就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836