在t-sql中每隔一行获取一个结果表

在t-sql中每隔一行获取一个结果表,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,我正在寻找一个t-sql脚本,它返回一个列表,显示表1中分组的每秒值 例如,我有以下数据表1,希望得到所需的结果列表: Table1: Customer Quantity A 5 A 8 (*) B 3 B 5 (*) B 11 C 7 D 4 D 23

我正在寻找一个t-sql脚本,它返回一个列表,显示表1中分组的每秒值

例如,我有以下数据表1,希望得到所需的结果列表:

Table1:
Customer    Quantity
A           5
A           8               (*)
B           3
B           5                (*)
B           11
C           7
D           4
D           23               (*)
所需返回列表:

Customer    Quantity
A           8
B           5
D           23
我想用“select distinct和left outer join”做一些事情,但我无法让它工作。可能我需要一个行编号,但不知道怎么做。有人能帮我吗

下面是我用来制作和填充表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);

使用“行数”窗口功能可以非常轻松地完成此操作:

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
您可以使用行号和CTE:

工作原理:


使用ROW_NUMBER将根据OVER中指定的内容为每一行分配一个序列号。在OVER中,我指定对customer上的行进行分区,这意味着同一客户上的每组数据将分别编号。然后按数量订购意味着它应该根据每个客户的数量订购数据-这样我就可以得到按数量订购的每个客户的第二行。

您使用的是什么DBMS?我使用MS SQL Server 2012。哪种订单使一行成为第二行?你是按数量订购的吗?现在我想按数量订购,但在现实生活中,它是按日期订购的,我在示例中没有添加。所以Mureink和Horia给出的答案就足够了。谢谢!我让它工作了!我还没有完全理解它,但正在研究它。我现在也知道了如何使用左外连接编写脚本并获得相同的结果。我已经添加了第二个表Table2,其数据与Table1中的数据相同。Horia和@Mureinik给出的答案更好,但我还是陈述了下面的情况。也是为了我自己的理解。使用a作为选择客户,数量,按客户订单按数量划分的行数从表1中选择不同的a.客户,a.从左侧外部联接表中选择数量2 b在a.客户=b.客户,其中rn=2银行!我还没有让它工作,也不完全理解它,但正在工作。知道我为什么会出错吗?请参见此处的打印屏幕:@cybork,在子查询上放置一个别名。:来自表1t@cybork在我的查询中有两个愚蠢的错误——我在数量后缺少一个逗号,子查询缺少一个表别名,而SQL Server坚持这样做。请看我编辑的答案。@Mureinik:谢谢!这个查询中唯一剩下的是DESC将是ASC。谢谢@电子人真的。我已经习惯于用这个成语来解释第n个问题,我出于本能使用desc。固定的
WITH data AS (
    SELECT  *, ROW_NUMBER() OVER  (PARTITION BY Customer ORDER BY Quantity) rn
    FROM    @Table1 
)
SELECT Customer, Quantity
FROM    data 
WHERE   rn = 2