Sql 按窗口内函数排序是如何工作的?

Sql 按窗口内函数排序是如何工作的?,sql,sql-server,Sql,Sql Server,我的问题是,在输出中,当我使用“rows”参数时,工资表不是按排序的。如果我删除“rows”参数,它的顺序是正确的。有人能告诉我按窗口内函数排序是如何工作的吗?除非明确使用order by子句,否则SQL表(或结果集中)中没有“order”。另外,调用AVG()的ROWS子句过多,因为没有orderby子句的AVG()将默认为整个分区,没有边界。因此,您可以使用: 选择姓名、性别、工资、平均工资(按性别划分)作为平均工资 来自员工 按平均工资排序(按性别划分); 请注意,除了SELECT子句之

我的问题是,在输出中,当我使用“rows”参数时,工资表不是按排序的。如果我删除“rows”参数,它的顺序是正确的。有人能告诉我按窗口内函数排序是如何工作的吗?

除非明确使用
order by
子句,否则SQL表(或结果集中)中没有“order”。另外,调用
AVG()
ROWS
子句过多,因为没有
orderby
子句的
AVG()
将默认为整个分区,没有边界。因此,您可以使用:

选择姓名、性别、工资、平均工资(按性别划分)作为平均工资
来自员工
按平均工资排序(按性别划分);
请注意,除了
SELECT
子句之外,还可以在
ORDER BY
子句中使用窗口函数。

除非明确使用
ORDER BY
子句,否则SQL表(或结果集中)中没有“ORDER”。另外,调用
AVG()
ROWS
子句过多,因为没有
orderby
子句的
AVG()
将默认为整个分区,没有边界。因此,您可以使用:

选择姓名、性别、工资、平均工资(按性别划分)作为平均工资
来自员工
按平均工资排序(按性别划分);

请注意,除了
SELECT
子句之外,还可以在
ORDER BY
子句中使用窗口函数。

旁注:如果将数据插入
INT
列,则不应将
insert into
语句中的数据插入单引号中(从而使其成为字符串文字,需要在内部转换为
INT
)!只需使用
…VALUES('Ron','male',5000);
@marc__s明白您的意思,谢谢。旁注:如果您将数据插入
INT
列中,则不应将
插入到
语句中的数据插入单引号中(因此使其成为字符串文字,需要在内部转换为
INT
)!只需使用
…值('Ron','male',5000)
@marcs明白你的意思了,谢谢。我打赌你不知道:
orderby
是在
SELECT
之后计算的,你可以写
orderby avesal
orderby 4
@Charlieface不,我不知道在SQL Server上是真的……是真的吗?引用:"ORDER BY子句中引用的列名必须与select列表中的列或列别名相对应,或者与FROM子句中指定的表中定义的列相对应,不得有任何歧义。如果ORDER BY子句引用select列表中的列别名,则列别名必须单独使用,而不能作为某些e的一部分ORDER BY子句中的表达式,例如:“明白了。我发现很难从所有不同的关系数据库中通过细微差别来跟踪订单。我打赌你不知道:
orderby
是在
SELECT
之后进行评估的,你可以编写
orderby ave\u sal
orderby 4
@Charlieface不,我不知道这在SQL Server上是真的……是真的吗?引用自:"ORDER BY子句中引用的列名必须与select列表中的列或列别名相对应,或者与FROM子句中指定的表中定义的列相对应,不得有任何歧义。如果ORDER BY子句引用select列表中的列别名,则列别名必须单独使用,而不能作为某些e的一部分例如,ORDER BY子句中的xpression:“注意了。我发现很难通过所有不同RDBMS的细微差别来跟踪顺序。
CREATE TABLE employee 
(
     name varchar(10),
     gender varchar(30), 
     salary int
);

INSERT INTO employee 
VALUES ('Mark', 'male', '5000'),
       ('John', 'male', '4500'),
       ('Pam', 'female', '5500'),
       ('Sara', 'female', '4000'),
       ('Todd', 'male', '3500'),
       ('Mary', 'female', '5000'),
       ('Ben', 'male', '6500'),
       ('Jodi', 'female', '7000'),
       ('Tom', 'male', '5500'),
       ('Ron', 'male', '5000');

SELECT 
    name, gender, salary, 
    AVG(salary) OVER (PARTITION BY gender ORDER BY salary 
                      rows between unbounded preceding and unbounded following) AS ave_sal
FROM
    employee