भरने nulls के साथ पिछले नहीं नल मान 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 तालिका, लेकिन मेरा उद्देश्य मैं सभी की जरूरत है डाक कोड आवंटित करने के लिए कुछ करने के लिए कर्मचारी की तरह कुछ बनाया के क्षेत्र "सेवा", तो ऐसा करने के लिए मैं चाहता हूँ कि भरने के लिए नल मान के साथ पिछले नहीं अशक्त मूल्य प्राप्त करने के लिए इस तरह से कुछ:

| 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 अशक्त अशक्त
00-001 12PH 0x30302D30303131325048
00-002 अशक्त अशक्त
00-003 अशक्त अशक्त
00-004 10PH 0x30302D30303431305048
00-005 अशक्त अशक्त

के बाद से जोड़ना अशक्त मूल्य पैदावार एक अशक्त मूल्य के साथ, आप केवल एक मूल्य मिलता है, जहां यह रिक्त नहीं है. फिर आप कर सकते हैं का लाभ ले लो बाइनरी छँटाई (बाएं से दाएं) और अधिकतम मूल्य के इस द्विआधारी के भीतर एक विंडोड समारोह, है कि हिस्सा है: MAX(...) OVER(ORDER BY Postal).

इस निकालता है सभी नल मान (के बाद से MAX पर ध्यान नहीं देता NULL) से अलग पहली पंक्ति में, के बाद से वहाँ है कोई पिछला गैर शून्य मान और डेटा के रूप में इस प्रकार है:

डाक IDemp MaxBinaryValue
00-000 अशक्त अशक्त
00-001 12PH 0x30302D30303131325048
00-002 अशक्त 0x30302D30303131325048
00-003 अशक्त 0x30302D30303131325048
00-004 10PH 0x30302D30303431305048
00-005 अशक्त 0x30302D30303431305048

यह तो सिर्फ एक मामला है के निकालने के हिस्से के द्विआधारी आप में रुचि रखते हैं (अक्षर 7-10) और वापस परिवर्तित करने के लिए varchar का उपयोग कर SUBSTRING और CONVERT

2021-11-23 13:48:50
1

एक सहसंबद्ध उप-क्वेरी काम हो सकता है:

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

मुझे लगता है कि यह करने के लिए समान है क्या मैं प्रस्ताव ऊपर है, लेकिन पार लागू है, तो तेजी से । हो सकता है अभी भी अशक्त, तो पहले एक रिक्त है । तो दिखना चाहिए दोनों दिशा में और तरह के द्वारा रचनाकार लक्ष्य के लिए डाक
vikjon0

मुझे लगता है कि यह होगा पर निर्भर अनुक्रमित है, लेकिन मैं उम्मीद के साथ सहसंबद्ध उप-क्वेरी और एक CROSS APPLY का उत्पादन करने के लिए बहुत इसी तरह की योजना है.
Richard Deeming

संभवतः, मैं बुरा अनुभव किया है अतीत में, लेकिन ज़ाहिर है SQL सर्वर विकसित किया गया है . वहाँ थे एक बार जब फिर से लिखने पुराने नेस्टेड कोड को पार करने के लिए लागू किया गया था एक यकीन है कि सफलता के पाठ्यक्रम के मामलों में काम किया है कि ठीक है मैं कभी नहीं देखा है.
vikjon0

जोड़ें AND K.IDemp IS NOT NULL करने के लिए सबक्वेरी के क्रम में उपेक्षा nulls.
Thorsten Kettner

@ThorstenKettner यह स्पष्ट नहीं है से सवाल है, लेकिन मुझे लगता है कि IDemp स्तंभ में Customers टेबल है NOT NULL.
Richard Deeming

परिणाम को देखने के सेशन की क्वेरी । डाक कोड 00-001 परिणाम में दो पंक्तियों के साथ एक IDemp '12PH' के साथ एक IDemp अशक्त. तो अशक्त नहीं कर सकते स्टेम से बाहरी में शामिल होने, लेकिन मौजूद होना चाहिए में ग्राहक तालिका.
Thorsten Kettner

@ThorstenKettner अच्छी पकड़ है ।
Richard Deeming

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में