应用场景
描述:根据"采购入库单明细"查询商品最近的供应商
"采购入库单明细":RKDZK
RKDZK:HH(货号)、TJBH(供应商编号)、KDRQ(开单日期)
思路:从"采购入库单明细"进行查询,需要从"采购入库单明细"中查询商品最近的开单日期,找到最近开单日期对应的商品供应商
--解释:下面SQL就是使用窗口函数,根据某个字段进行分区,再根据某个字段进行排序;
--首先,整体上会有一个排序,其次窗口函数会为每一行记录分配一个编号,
--如果使用ROW_NUMBER()函数,这个编号是不重复并且顺序的,即不会跳号
SELECT
HH,TJBH
FROM
(
SELECT
HH,TJBH,KDRQ,
ROW_NUMBER() OVER (PARTITION BY HH ORDER BY KDRQ DESC) AS BS
FROM RKDZK
) A
WHERE A.BS = 1
ROW_NUMBER()窗口函数
在 SQL Server 中,ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 是一种常用的窗口函数语法,用于为每个分区内的行分配唯一的行号。PARTITION BY 子句用于指定分区的列,而 ORDER BY 子句用于指定排序的列或表达式
以下是 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 的示例语法:
SELECT column1, column2, ...,
ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) AS row_num
FROM table_name
解释一下上述语法的各个部分:
- SELECT column1, column2, ... 是选择要包含在结果集中的列。
- ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) 是 ROW_NUMBER() 窗口函数的使用方式
- PARTITION BY column1 指定了用于分区的列,即根据哪些列进行分组。
- ORDER BY column2 指定了在每个分区内对结果集进行排序的列或表达式。
- ROW_NUMBER() 函数会为每个分区内的行分配一个唯一的整数值。
- FROM table_name 是查询的数据来源表。
示例用法:
SELECT CustomerID, OrderID, OrderDate,
ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderDate) AS row_num
FROM Orders
这个示例查询了 "Orders" 表中的订单信息,并在每个客户的分区内按照订单日期进行排序,为每个分区内的行分配了一个唯一编号