使用 SQL LAG() 函数

问题描述 投票:0回答:1

我正在尝试使用 SQL 中的

LAG
函数来尝试此操作,但我不确定我是否使用错误。

我想做的是,当您在

LOCAL_ID
列下看到 NULL 时,用上面的
NULL
填充该
LOCAL_ID

因此,每次您在

ORDER_IN_LOCAL_ID
列下看到 1 以及在
GROUP_ID
列下看到新 ID 的开头时,请用 NULL 上方
LOCAL_ID
中的内容填充
LOCAL_ID

我更改了原始图像以显示更大的数据集。我认为 LAG 函数的问题是它只会取其正上方的值,所以我的问题是当有很多 NULL 时,它只会结束取上面的 NULL,而不是上面的

LOCAL_ID
该组的顶部。

输出:

UNIQUE_ID LOCAL_ID GROUP_ID LOCAL_STAY_ID ORDER_IN_LOCAL_ID
1         808      1        808           1
2         NULL     1        909           2
3         676      7        676           1
4         674      8        674           1
5         352      9        352           1
6         NULL     9        134           2
7         232      11       232           1
8         NULL     11       431           2
9         NULL     11       323           3
10        NULL     11       567           4
11        800      98       800           1
11        NULL     98       786           1
11        NULL     98       345           1

输出:

UNIQUE_ID LOCAL_ID GROUP_ID LOCAL_STAY_ID ORDER_IN_LOCAL_ID
1         808      1        808           1
2         808      1        909           2
3         676      7        676           1
4         674      8        674           1
5         352      9        352           1
6         352      9        134           2
7         232      11       232           1
8         232      11       431           2
9         232      11       323           3
10        232      11       567           4
11        800      98       800           1
11        800      98       786           1
11        800      98       345           1

查询:

,CASE    WHEN a.LOCAL_ID IS NULL  THEN LAG(a.LOCAL_ID) OVER (
        ORDER BY b.GROUP_ID
        ) ELSE a.LOCAL_ID END  AS ANSWER
sql mysql window-functions sql-function
1个回答
0
投票
CREATE TABLE your_table (
  UNIQUE_ID INT,
  LOCAL_ID INT,
  GROUP_ID INT,
  LOCAL_STAY_ID INT,
  ORDER_IN_LOCAL_ID INT
);

INSERT INTO your_table (UNIQUE_ID, LOCAL_ID, GROUP_ID, LOCAL_STAY_ID, ORDER_IN_LOCAL_ID) VALUES
  (1,  808, 1,  808, 1),
  (2, NULL, 1,  909, 2),
  (3,  676, 7,  676, 1),
  (4,  674, 8,  674, 1),
  (5,  352, 9,  352, 1),
  (6, NULL, 9,  134, 2),
  (7,  232, 11, 232, 1),
  (8, NULL, 11, 431, 2),
  (9, NULL, 11, 323, 3),
  (10, NULL, 11, 567, 4),
  (11, 800, 98, 800, 1),
  (11, NULL, 98, 786, 1),
  (11, NULL, 98, 345, 1);

Records: 13  Duplicates: 0  Warnings: 0
CREATE TEMPORARY TABLE temp_table AS
WITH RECURSIVE fill_nulls AS (
  SELECT 
    UNIQUE_ID,
    CASE WHEN ORDER_IN_LOCAL_ID = 1 THEN LOCAL_ID ELSE NULL END AS LOCAL_ID
  FROM your_table
  WHERE ORDER_IN_LOCAL_ID = 1

  UNION ALL

  SELECT
    t.UNIQUE_ID,
    CASE WHEN t.ORDER_IN_LOCAL_ID = 1 THEN t.LOCAL_ID ELSE fn.LOCAL_ID END
  FROM your_table t
  JOIN fill_nulls fn ON t.UNIQUE_ID = fn.UNIQUE_ID + 1
)
SELECT * FROM fill_nulls;
Records: 53  Duplicates: 0  Warnings: 0
UPDATE your_table AS orig
JOIN temp_table AS temp
ON orig.UNIQUE_ID = temp.UNIQUE_ID
SET orig.LOCAL_ID = temp.LOCAL_ID
WHERE orig.LOCAL_ID IS NULL;


Rows matched: 7  Changed: 7  Warnings: 0
SELECT * FROM your_table
唯一_ID LOCAL_ID GROUP_ID LOCAL_STAY_ID ORDER_IN_LOCAL_ID
1 808 1 808 1
2 808 1 909 2
3 676 7 676 1
4 674 8 674 1
5 352 9 352 1
6 352 9 134 2
7 232 11 232 1
8 232 11 431 2
9 232 11 323 3
10 232 11 567 4
11 800 98 800 1
11 800 98 786 1
11 800 98 345 1

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.