เติ nulls กับสุดท้ายไม่ใช่โพรโทคอล aimcomment ค่าในภาษา sql บนเซิร์ฟเวอร์ส่งขอรหัส

0

คำถาม

ฉันมีสองตารางข้อมูลเรียบร้อยแล้ว PostalCodes (กับคอลัมน์กับค่าจาก 00-00 จะ 99-999)และ Customers (ซึ่งมีเคียงข้าทั้งหมดเป็นลูกค้าของข้อมูลเป็นรหัสไปรษณีย์สำหรับและหมายเลขของพนักงานซึ่งมันรับใช้ที่เป็นลูกค้า).

ดังนั้นพวกนี้สองคนฉันแค่จะมาร่วมทางรหัสไปรษณีย์สำหรับ:

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 โต๊ะแต่สำหรับการเล็งของฉันฉันต้องส่งรหัสได้รับมอบหมายให้มีพนักงานเพื่อสร้างบางอย่างเช่น"กอบพื้นที่ของบริการ"ดังนั้นต้องทำอย่างนั้นฉันต้องการเพื่อเติมเต็มโพรโทคอล aimcomment ค่ากับสุดท้ายไม่ใช่โพรโทคอล aimcomment ค่าเพื่อเอาอะไรบางอย่างเหมือนนี้:

| 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)

ฉันเจองสามคำถามที่คล้ายกันอยู่แล้ว,แต่ไม่สามารถออกมาว่าต้องใช้พวกเขาได้คำตอบกันคดีของฉัน

sql sql-server
2021-11-23 13:11:15
2

คำตอบที่ดีที่สุด

2

ภาษา sql เซิร์ฟเวอร์ไม่สนับสนุนที่ไม่สนใจ nulls ใช้งานตัวเลือก LAG (ยัง)แต่คุณสามารถจะจัดการเรื่องนี้โดยสร้างฐานสองค่าจากคอลัมน์คุณต้องการจะสั่งโดยรและคอลัมน์ที่คุณต้องการที่จะดึงข้อมูกและโทรมา MAX ซึ่งมันไม่สนใจ nulls. เต็มทำงานทางออกจะเป็น:

IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL
    DROP TABLE #T;

CREATE TABLE IF NOT EXISTS #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
ส่ง IDemp BinaryValue
00-000 โพรโทคอล aimcomment โพรโทคอล aimcomment
00-001 12PH 0x30302D30303131325048
00-002 โพรโทคอล aimcomment โพรโทคอล aimcomment
00-003 โพรโทคอล aimcomment โพรโทคอล aimcomment
00-004 10PH 0x30302D30303431305048
00-005 โพรโทคอล aimcomment โพรโทคอล aimcomment

ตั้งแต่ concatenating ค่าโพรโทคอล aimcomment มีค่าเป็นค่าโพรโทคอล aimcomment พวกเธอก็สมควรได้ค่าอยู่ไหนมันไม่ใช่โพรโทคอล aimcomment. คุณสามารถใช้ประโยชน์จากการเรียงลำดับไบนารี(จากซ้ายไปขวา)และค่าสูงสุดของแฟ้มไบนารีภายใน windowed ฟังก์ชันนั่นคือส่วนหนึ่ง: MAX(...) OVER(ORDER BY Postal).

นี่จะเป็นทั้งหมดโพรโทคอล aimcomment ค่า(ตั้งแต่ MAX รายการที่ไม่ต้องสนใจ NULL)นอกจากแถวหน้าตั้งแต่ยังไม่มีก่อนหน้านี้ไม่ใช่โพรโทคอล aimcomment ค่าและให้ข้อมูลที่ติดตาม:

ส่ง IDemp MaxBinaryValue
00-000 โพรโทคอล aimcomment โพรโทคอล aimcomment
00-001 12PH 0x30302D30303131325048
00-002 โพรโทคอล aimcomment 0x30302D30303131325048
00-003 โพรโทคอล aimcomment 0x30302D30303131325048
00-004 10PH 0x30302D30303431305048
00-005 โพรโทคอล aimcomment 0x30302D30303431305048

มันก็แค่คดีของ extracting คนส่วนของไบนารีเธอสนใจใน(ตัวอักษร 7-10)และการเปลี่ยนกลับไปใช้ varchar SUBSTRING แล้ว CONVERT

2021-11-23 13:48:50
1

เป็น correlated รายการย่อยขอ query อาจจะทำงาน:

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 
2021-11-23 13:38:05

ผมเดาว่านี่คงคล้ายกับสิ่งที่ฉันขอแต่งงานด้านบนแต่ข้าปรับใช้คืนนั้นเร็วขึ้น อาจจะยังคงเป็นโพรโทคอล aimcomment ถ้าคนแรกคือโพรโทคอล aimcomment. ดังนั้นควรมองในทั้งสองทิศทางที่ไม่ถูกต้องและเรียงลำดับตาม@title:menu ที่ของข้อแตกต่างไปส่งของเป้าหมาย
vikjon0

ฉันคิดว่ามันขึ้นอยู่กับการ indexes แต่ฉันจะคาดหวังที่ correlated รายการย่อยขอบการค้นหาและ CROSS APPLY อยากจะได้ดูแล้วก็เหมือนแผนนิดหน่อย
Richard Deeming

เป็นไปได้ฉันมีประสบการณ์ที่เลวในอดีตมาเหมือนกันแต่แน่นอนภาษา sql เซิร์ฟเวอร์ได้พัฒนาแล้ว นั่นเป็นช่วงเวลาที่การเขียนเก่าของรอบการรหัสผ่านปรับใช้เป็นแน่นอความสำเร็จแต่แน่นอนที่คดีมันทำงานสบายดีฉันไม่เคยเห็นมาก่อน
vikjon0

เพิ่ม AND K.IDemp IS NOT NULL ที่ subquery เพื่อ neglect nulls.
Thorsten Kettner

@ThorstenKettner มันไม่ปลอดโปร่งตั้งคำถาม,แต่ฉันจะเดาว่า IDemp คอลัมน์ใน Customers โต๊ะก็คือ NOT NULL.
Richard Deeming

มองดูผลของปฎิบัติงานกับการค้นหา. การหัสไปรษณีย์สำหรับ 00-001 ผลในสองคนแถวหนึ่งกับ IDemp'12PH'หนึ่งเดียวกับ IDemp โพรโทคอล aimcomment. ดังนั้นคนโพรโทคอล aimcomment ไม่สามารถจากที่ริงๆข้างนอร่วมกับแต่ต้องมีตัวตนอยู่ในลูกค้าโต๊ะ
Thorsten Kettner

@ThorstenKettner รติดเชื้อที่ดี
Richard Deeming

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่