|
1 | 1 | ---
|
2 |
| -title: LAST_VALUE |
3 |
| ---- |
4 |
| - |
5 |
| -import FunctionDescription from '@site/src/components/FunctionDescription'; |
6 |
| - |
7 |
| -<FunctionDescription description="Introduced: v1.1.50"/> |
8 |
| - |
9 |
| -Returns the last value from an ordered group of values. |
10 |
| - |
11 |
| -See also: |
12 |
| - |
13 |
| -- [FIRST_VALUE](first-value.md) |
14 |
| -- [NTH_VALUE](nth-value.md) |
15 |
| - |
16 |
| -## Syntax |
17 |
| - |
18 |
| -```sql |
19 |
| -LAST_VALUE(expression) OVER ([PARTITION BY partition_expression] ORDER BY order_expression [window_frame]) |
20 |
| -``` |
21 |
| - |
22 |
| -For the syntax of window frame, see [Window Frame Syntax](index.md#window-frame-syntax). |
23 |
| - |
24 |
| -## Examples |
25 |
| - |
26 |
| -```sql |
27 |
| -CREATE TABLE employees ( |
28 |
| - employee_id INT, |
29 |
| - first_name VARCHAR(50), |
30 |
| - last_name VARCHAR(50), |
31 |
| - salary DECIMAL(10,2) |
32 |
| -); |
33 |
| - |
34 |
| -INSERT INTO employees (employee_id, first_name, last_name, salary) |
35 |
| -VALUES |
36 |
| - (1, 'John', 'Doe', 5000.00), |
37 |
| - (2, 'Jane', 'Smith', 6000.00), |
38 |
| - (3, 'David', 'Johnson', 5500.00), |
39 |
| - (4, 'Mary', 'Williams', 7000.00), |
40 |
| - (5, 'Michael', 'Brown', 4500.00); |
41 |
| - |
42 |
| --- Use LAST_VALUE to retrieve the first name of the employee with the lowest salary |
43 |
| -SELECT employee_id, first_name, last_name, salary, |
44 |
| - LAST_VALUE(first_name) OVER (ORDER BY salary DESC) AS lowest_salary_first_name |
45 |
| -FROM employees; |
46 |
| - |
47 |
| -employee_id | first_name | last_name | salary | lowest_salary_first_name |
48 |
| -------------+------------+-----------+---------+------------------------ |
49 |
| -4 | Mary | Williams | 7000.00 | Michael |
50 |
| -2 | Jane | Smith | 6000.00 | Michael |
51 |
| -3 | David | Johnson | 5500.00 | Michael |
52 |
| -1 | John | Doe | 5000.00 | Michael |
53 |
| -5 | Michael | Brown | 4500.00 | Michael |
| 2 | +title: LAST_VALUE |
| 3 | +--- |
| 4 | + |
| 5 | +import FunctionDescription from '@site/src/components/FunctionDescription'; |
| 6 | + |
| 7 | +<FunctionDescription description="引入版本: v1.2.568"/> |
| 8 | + |
| 9 | +当使用 `IGNORE NULLS` 时,LAST_VALUE 函数返回窗口框架中最后一个非 NULL 值(如果所有值均为 NULL,则返回 NULL)。如果未指定,默认值为 RESPECT NULLS。 |
| 10 | + |
| 11 | +另请参阅: |
| 12 | + |
| 13 | +- [FIRST_VALUE](first-value.md) |
| 14 | +- [NTH_VALUE](nth-value.md) |
| 15 | + |
| 16 | +## 语法 |
| 17 | + |
| 18 | +```sql |
| 19 | +LAST_VALUE(expression) [ { IGNORE | RESPECT } NULLS ] OVER ([PARTITION BY partition_expression] ORDER BY order_expression [window_frame]) |
| 20 | +``` |
| 21 | + |
| 22 | +有关窗口框架的语法,请参阅 [窗口框架语法](index.md#window-frame-syntax)。 |
| 23 | + |
| 24 | +## 示例 |
| 25 | + |
| 26 | +```sql |
| 27 | +CREATE TABLE employees ( |
| 28 | + employee_id INT, |
| 29 | + first_name VARCHAR(50), |
| 30 | + last_name VARCHAR(50), |
| 31 | + salary DECIMAL(10,2) |
| 32 | +); |
| 33 | + |
| 34 | +INSERT INTO employees (employee_id, first_name, last_name, salary) |
| 35 | +VALUES |
| 36 | + (1, 'John', 'Doe', 5000.00), |
| 37 | + (2, 'Jane', 'Smith', 6000.00), |
| 38 | + (3, 'David', 'Johnson', 5500.00), |
| 39 | + (4, 'Mary', 'Williams', 7000.00), |
| 40 | + (5, 'Michael', 'Brown', 4500.00); |
| 41 | + |
| 42 | +-- 使用 LAST_VALUE 检索薪水最低的员工的 first_name |
| 43 | +SELECT employee_id, first_name, last_name, salary, |
| 44 | + LAST_VALUE(first_name) OVER (ORDER BY salary DESC) AS lowest_salary_first_name |
| 45 | +FROM employees; |
| 46 | + |
| 47 | +employee_id | first_name | last_name | salary | lowest_salary_first_name |
| 48 | +------------+------------+-----------+---------+------------------------ |
| 49 | +4 | Mary | Williams | 7000.00 | Michael |
| 50 | +2 | Jane | Smith | 6000.00 | Michael |
| 51 | +3 | David | Johnson | 5500.00 | Michael |
| 52 | +1 | John | Doe | 5000.00 | Michael |
| 53 | +5 | Michael | Brown | 4500.00 | Michael |
| 54 | +``` |
| 55 | + |
| 56 | +### 使用 IGNORE NULLS 返回非 NULL 值 |
| 57 | + |
| 58 | +```sql |
| 59 | +CREATE or replace TABLE example AS SELECT * FROM (VALUES |
| 60 | + (0, 1, 614), |
| 61 | + (1, 1, null), |
| 62 | + (2, 1, null), |
| 63 | + (3, 1, 639), |
| 64 | + (4, 1, 2027) |
| 65 | +) tbl(id, user_id, order_id); |
| 66 | + |
| 67 | + |
| 68 | +SELECT |
| 69 | + id, |
| 70 | + user_id, |
| 71 | + order_id, |
| 72 | + LAST_VALUE (order_id) IGNORE NULLS over ( |
| 73 | + PARTITION BY user_id |
| 74 | + ORDER BY |
| 75 | + id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING |
| 76 | + ) AS last_order_id |
| 77 | +FROM |
| 78 | + example |
| 79 | + |
| 80 | +┌───────────────────────────────────────────────────────┐ |
| 81 | +│ id │ user_id │ order_id │ last_order_id │ |
| 82 | +├───────┼─────────┼──────────────────┼──────────────────┤ |
| 83 | +│ 0 │ 1 │ 614 │ NULL │ |
| 84 | +│ 1 │ 1 │ NULL │ 614 │ |
| 85 | +│ 2 │ 1 │ NULL │ 614 │ |
| 86 | +│ 3 │ 1 │ 639 │ 614 │ |
| 87 | +│ 4 │ 1 │ 2027 │ 639 │ |
| 88 | +└───────────────────────────────────────────────────────┘ |
| 89 | + |
54 | 90 | ```
|
0 commit comments