2014-06-21 6 views
5

जैसा कि आप जानते हैं कि एलएजी() & लीड() विश्लेषणात्मक फ़ंक्शंस एक ही परिणाम में पिछली और अगली पंक्ति से डेटा को स्वयं-जुड़ने के उपयोग के बिना सेट करते हैं। लेकिन क्या नल मूल्यों तक पहुंचने तक नल मूल्यों को अनदेखा करना संभव है?SQL सर्वर में LAG() और LEAD() फ़ंक्शंस का उपयोग करते समय नल मानों को अनदेखा करना संभव है?

उत्तर

0

ओरेकल 11 ignore nulls विकल्प का समर्थन करता है जो आप वही चाहते हैं जो आप चाहते हैं। बेशक, आपका प्रश्न SQL सर्वर के बारे में है, लेकिन कभी-कभी यह जानकर खुशी हो रही है कि कार्यक्षमता कहीं मौजूद है।

इस कार्यक्षमता को अनुकरण करना संभव है। विचार पिछले मान के आधार पर समूह को शून्य मान असाइन करना है। संक्षेप में, यह इससे पहले गैर-शून्य मानों की संख्या को गिन रहा है। आप इसे एक सहसंबंधित सबक्वायरी के साथ कर सकते हैं। या, दो पंक्ति संख्याओं के अंतर के साथ, और अधिक दिलचस्प बात है। फिर समूह के भीतर, आप केवल max() का उपयोग कर सकते हैं।

मुझे लगता है कि आप जो चाहते हैं वह निम्नलिखित करता है। मान लें कि colNULL मान हैं और ordering पंक्तियों के लिए आदेश देने की है:

select t.*, 
     max(col) over (partition by grp) as LagOnNull 
from (select t.*, 
      (row_number() over (order by ordering) - 
       row_number() over (partition by col order by ordering) 
      ) as grp 
     from table t 
    ) t; 

lead() समान है, लेकिन आदेश उलट है। और, यह अतिरिक्त विभाजन कुंजी के साथ काम करेगा, लेकिन आपको उन्हें सभी विंडो अभिव्यक्तियों में जोड़ना होगा।

+0

आपके उत्तर गॉर्डन के लिए धन्यवाद। लेकिन मैं इस नमूने में 'col2' क्या समझ नहीं पा रहा हूं? – Mostapha777

+0

'col2'' col' होना चाहिए, 'lag() '/' लीड() 'के लिए तर्क। –

+0

क्रिएटिव समाधान गॉर्डन। लेकिन दुर्भाग्य से मेरे लिए काम नहीं किया :( – Mostapha777

2

विंडो कार्यों का उपयोग करना संभव है। अधिक जानकारी के लिए इट्ज़िक बेन-गण द्वारा इस article का एक पठन पढ़ें।

नीचे दिए गए कोड में, सीटीई को हाल ही में न्यूल आईडी मान प्राप्त हो रहा है, तो अगला चयन वास्तविक कॉलम मान प्राप्त करता है। यह उदाहरण एलएजी का उपयोग करता है। उदाहरण के लिए।

-- DDL for T1 
SET NOCOUNT ON; 
USE tempdb; 
IF OBJECT_ID(N'dbo.T1', N'U') IS NOT NULL DROP TABLE dbo.T1; 
GO 
CREATE TABLE dbo.T1 
(
id INT NOT NULL CONSTRAINT PK_T1 PRIMARY KEY, 
col1 INT NULL 
); 

-- Small set of sample data 
TRUNCATE TABLE dbo.T1; 

INSERT INTO dbo.T1(id, col1) VALUES 
(2, NULL), 
(3, 10), 
(5, -1), 
(7, NULL), 
(11, NULL), 
(13, -12), 
(17, NULL), 
(19, NULL), 
(23, 1759); 

;WITH C AS 
(
SELECT 
    id, 
    col1, 
    MAX(CASE WHEN col1 IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grp 
FROM dbo.T1 
) 
SELECT 
    id, 
    col1, 
    (SELECT col1 FROM dbo.T1 WHERE id = grp) lastval  
FROM C; 
संबंधित मुद्दे

 संबंधित मुद्दे