在t-sql中将每个第二行作为结果表获取

时间:2015-08-17 06:52:28

标签: sql sql-server tsql select

我正在寻找一个返回列表的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);

2 个答案:

答案 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_NUMBERCTE

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意味着它应该根据每个客户的数量订购数据 - 所以我可以按数量订购每个客户的第二行。