我正在寻找一个返回列表的t-sql脚本,该列表显示来自Table1的分组中的每一个值。
例如,我有以下数据(表1),并希望得到所需的结果列表:
Table1:
Customer Quantity
A 5
A 8 (*)
B 3
B 5 (*)
B 11
C 7
D 4
D 23 (*)
期望的retult-list:
Customer Quantity
A 8
B 5
D 23
我考虑用“选择不同的左外连接”做一些事情,但我无法让它发挥作用。可能我需要行编号,但无法弄清楚如何操作。有人可以帮帮我吗?
Beneath是我用来制作和填充表1的脚本:
CREATE TABLE Table1
(Customer nvarchar(1) NULL,
Quantity int NOT NULL);
INSERT INTO Table1(Customer,Quantity)
VALUES
('A',5),
('A',8),
('B',3),
('B',5),
('B',11),
('C',7),
('D',4),
('D',23);
答案 0 :(得分:6)
使用row_number
窗口函数可以非常轻松地完成此操作:
SELECT customer, quantity
FROM (SELECT customer, quantity,
ROW_NUMBER() OVER (PARTITION BY customer
ORDER BY quantity ASC) AS rn
FROM table1) t
WHERE rn = 2
答案 1 :(得分:3)
您可以使用ROW_NUMBER
和CTE
:
WITH data AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Quantity) rn
FROM @Table1
)
SELECT Customer, Quantity
FROM data
WHERE rn = 2
工作原理:
使用ROW_NUMBER()
将根据OVER ()
中指定的内容为每一行分配一个序号。在OVER
我指定PARTITION
客户的行,这意味着同一客户的每组数据将分别编号。然后ORDER BY Quantity
意味着它应该根据每个客户的数量订购数据 - 所以我可以按数量订购每个客户的第二行。