我有兩個表PostalCodes(其中一列的值從 00-00 到 99-999)和Customers(除了所有客戶資料外,還有郵政編碼和為客戶提供服務的員工 ID)。
所以這兩個我只是通過郵政編碼加入:
SELECT DISTINCT
KP.postal,
K.IDemp
FROM
PostalCodes KP
LEFT JOIN
[Customers] K ON K.postal = KP.postal
我得到了這個:
| postal | IDemp |
-------- -------
| 00-000 | NULL |
| 00-001 | NULL |
| 00-001 | 12PH |
| 00-002 | NULL |
| 00-003 | NULL |
| 00-004 | NULL |
| 00-004 | 10PH |
| 00-005 | NULL |
| ... | ... |
因此,您可以看到表中并未使用所有郵政編碼Customers,但出于我的目的,我需要分配給某個員工的所有郵政編碼來創建諸如“服務區域”之類的內容,因此為此我想用最后一個填充空值非空值得到這樣的東西:
| postal | IDemp |
-------- -------
| 00-000 | NULL |
| 00-001 | 12PH |
| 00-002 | 12PH |
| 00-003 | 12PH |
| 00-004 | 10PH |
| 00-005 | 10PH |
| ... | ... |
我試圖使用LAG()函式,但它不起作用(或者至少我不知道如何正確使用它)
LAG(K.IDemp) OVER (ORDER BY KP.postal)
我已經發現很少有類似的問題,但無法想出如何將他們的答案用于我的案例。
uj5u.com熱心網友回復:
SQL Server LAG(尚)不支持忽略空值選項,但您可以通過從要排序的列以及要檢索和呼叫的列創建二進制值來解決此問題,該列MAX會忽略空值。一個完整的作業解決方案是:
IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL
DROP TABLE #T;
CREATE TABLE #T (Postal VARCHAR(6) NOT NULL, IDemp VARCHAR(4) NULL);
INSERT #T (Postal, IDemp)
VALUES
('00-000', NULL),
('00-001', '12PH'),
('00-002', NULL),
('00-003', NULL),
('00-004', '10PH'),
('00-005', NULL);
SELECT *,
LastNonNull = CONVERT(VARCHAR(6),
SUBSTRING(
MAX(CONVERT(BINARY(6), Postal) CONVERT(BINARY(4), IDemp))
OVER(ORDER BY Postal), 7,4))
FROM #T;
它可能有助于解釋這是否被分解了一點,我們看看這個結果:
SELECT *,
BinaryValue = CONVERT(BINARY(6), Postal) CONVERT(BINARY(4), IDemp)
FROM #T
| 郵政 | 身份驗證 | 二進制值 |
|---|---|---|
| 00-000 | 空值 | 空值 |
| 00-001 | 12PH | 0x30302D30303131325048 |
| 00-002 | 空值 | 空值 |
| 00-003 | 空值 | 空值 |
| 00-004 | 10PH | 0x30302D30303431305048 |
| 00-005 | 空值 | 空值 |
由于連接空值會產生空值,因此您只能獲得不為空的值。然后,您可以利用二進制排序(從左到右)并在視窗函式中獲取此二進制檔案的最大值,即部分:MAX(...) OVER(ORDER BY Postal)。
這將洗掉除第一行之外的所有 NULL 值(因為MAXignores NULL),因為沒有以前的非空值并提供如下資料:
| 郵政 | 身份驗證 | 最大二進制值 |
|---|---|---|
| 00-000 | 空值 | 空值 |
| 00-001 | 12PH | 0x30302D30303131325048 |
| 00-002 | 空值 | 0x30302D30303131325048 |
| 00-003 | 空值 | 0x30302D30303131325048 |
| 00-004 | 10PH | 0x30302D30303431305048 |
| 00-005 | 空值 | 0x30302D30303431305048 |
然后只是提取您感興趣的二進制檔案部分(字符 7-10)并使用SUBSTRING和轉換回 varchar 的情況CONVERT
uj5u.com熱心網友回復:
相關子查詢可能有效:
SELECT DISTINCT
KP.postal,
(SELECT TOP 1 K.IDemp
FROM [Customers] K
WHERE K.postal <= KP.postal
AND K.IDemp Is Not Null
ORDER BY K.postal DESC) As IDemp
FROM
PostalCodes KP
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364503.html
標籤:sql sql-server
下一篇:如何顯示結果中的資料來自哪個表
