6

एसक्यूएल सर्वर के लिए 2008 R2 के क्षेत्र में नवीनतम गैर-शून्य मान के साथ शून्य मान की जगहresultset श्रृंखला (एसक्यूएल सर्वर 2008 R2)

मैं एक resultset है कि इस (नोट की तरह लग रहा है [price] संख्यात्मक है, शून्य से नीचे एक का प्रतिनिधित्व करता है शून्य मूल्य, परिणाम सेट product_id और टाइमस्टैम्प)

product timestamp   price 
------- ---------------- ----- 
    5678 2008-01-01 12:00 12.34 
    5678 2008-01-01 12:01 NULL 
    5678 2008-01-01 12:02 NULL 
    5678 2008-01-01 12:03 23.45 
    5678 2008-01-01 12:04 NULL 

मैं एक परिणाम के सेट है कि (अनिवार्य) प्रतियां नवीनतम पूर्ववर्ती पंक्ति से एक गैर शून्य मान, एक resultset का उत्पादन करने के लिए है कि बदलना चाहते द्वारा आदेश दिया गया है ऐसा लगता है:

product timestamp   price 
------- ---------------- ----- 
    5678 2008-01-01 12:00 12.34 
    5678 2008-01-01 12:01 12.34 
    5678 2008-01-01 12:02 12.34 
    5678 2008-01-01 12:03 23.45 
    5678 2008-01-01 12:04 23.45 

मैं किसी भी कुल/विंडोइंग समारोह है कि मुझे इस (यह केवल एसक्यूएल सर्वर 2008 के लिए आवश्यक आर 2। फिर)

मैं एक विश्लेषणात्मक समेकित फ़ंक्शन उस के लिए ऐसा करते हैं खोजने के लिए उम्मीद कर रही थी करने की अनुमति देगा भी नहीं मिलता है मुझे, कुछ की तरह ...

LAST_VALUE(price) OVER (PARTITION BY product_id ORDER BY timestamp) 

लेकिन मैं किसी भी तरह से एक "संचयी नवीनतम गैर शून्य मान" विंडो में (पूर्ववर्ती पंक्तियों को खिड़की के लिए बाध्य करने के लिए क्या करना है, बजाय खोजने के लिए प्रतीत नहीं संपूर्ण विभाजन)

तालिका-मूल्यवान उपयोगकर्ता परिभाषित फ़ंक्शन बनाने के अलावा, मैं क्या कोई ऐसा अंतर्निहित है जो इसे पूरा करेगा?


अद्यतन:

जाहिर है, इस सुविधा के उपलब्ध 'डेनलि' CTP में है, लेकिन एसक्यूएल सर्वर 2008 R2 में नहीं।

LAST_VALUE http://msdn.microsoft.com/en-us/library/hh231517%28v=SQL.110%29.aspx

मैं सिर्फ यह एसक्यूएल सर्वर 2008 यह Oracle में उपलब्ध है (के बाद से 10gR2 कम से कम) में उपलब्ध होने की उम्मीद है, और मैं MySQL 5.1 में इसी तरह कुछ कर सकते हैं, एक स्थानीय चर का उपयोग कर।

http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions083.htm

+0

कौन सा समारोह आप मतलब है कि डेनलि में उपलब्ध है, लेकिन नहीं 2008 R2 ?? –

उत्तर

8

आप निम्न की कोशिश कर सकते हैं:

* Updated **

-- Test Data 
DECLARE @YourTable TABLE(Product INT, Timestamp DATETIME, Price NUMERIC(16,4)) 

INSERT INTO @YourTable 
SELECT 5678, '20080101 12:00:00', 12.34 
UNION ALL 
SELECT 5678, '20080101 12:01:00', NULL 
UNION ALL 
SELECT 5678, '20080101 12:02:00', NULL 
UNION ALL 
SELECT 5678, '20080101 12:03:00', 23.45 
UNION ALL 
SELECT 5678, '20080101 12:04:00', NULL 

;WITH CTE AS 
(
    SELECT * 
    FROM @YourTable 
) 

-- Query 
SELECT A.Product, A.Timestamp, ISNULL(A.Price,B.Price) Price 
FROM CTE A 
OUTER APPLY ( SELECT TOP 1 * 
       FROM CTE 
       WHERE Product = A.Product AND Timestamp < A.Timestamp 
       AND Price IS NOT NULL 
       ORDER BY Product, Timestamp DESC) B 

--Results 
Product Timestamp Price 
5678 2008-01-01 12:00:00.000 12.3400 
5678 2008-01-01 12:01:00.000 12.3400 
5678 2008-01-01 12:02:00.000 12.3400 
5678 2008-01-01 12:03:00.000 23.4500 
5678 2008-01-01 12:04:00.000 23.4500 
+0

यह लागू करने वाला कीवर्ड मेरे लिए नया है। मैं इसे एक शॉट दूंगा। धन्यवाद! – spencer7593

+0

@ spencer7593 - मुझे बताएं कि यह कैसा चल रहा है। – Lamak

+1

spencer7593 @ - इसके अलावा, आप इस लिंक पर 'APPLY' ऑपरेटर पर कुछ प्रलेखन पा सकते हैं: http://technet.microsoft.com/en-us/library/ms175156.aspx – Lamak

2

आज़माएं:

;WITH SortedData AS 
(
    SELECT 
     ProductID, TimeStamp, Price, 
     ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY TimeStamp DESC) AS 'RowNum' 
    FROM dbo.YourTable 
) 
UPDATE SortedData 
SET Price = (SELECT TOP 1 Price 
      FROM SortedData sd2 
     WHERE sd2.RowNum > SortedData.RowNum 
      AND sd2.Price IS NOT NULL) 
WHERE 
    SortedData.Price IS NULL 

असल में, CTE अनुसार क्रमबद्ध एक सूची बनाता है टाइमस्टैम्प (अवरोही) द्वारा - नया पहले है जब भी कोई नल पाया जाता है, तो अगली पंक्ति जिसमें नॉट नल मूल्य शामिल होता है और उस मान का उपयोग नल मूल्य के साथ पंक्ति को अद्यतन करने के लिए किया जाता है।

1

मेरे पास एक तालिका है जिसमें निम्न डेटा है। मैं शून्य मूल्यों के बिना पिछले मूल्य के साथ वेतन कॉलम में सभी नल अपडेट करना चाहता हूं।

तालिका:

id name salary 
1 A  4000 
2 B 
3 C 
4 C 
5 D  2000 
6 E 
7 E 
8 F  1000 
9 G  2000 
10 G  3000 
11 G  5000 
12 G 
यहाँ

क्वेरी कि मेरे लिए काम करता है।

select a.*,first_value(a.salary)over(partition by a.value order by a.id) as abc from 
(
    select *,sum(case when salary is null then 0 else 1 end)over(order by id) as value from test)a 

उत्पादन:

id name salary Value abc 
1 A  4000 1  4000 
2 B    1  4000 
3 C    1  4000 
4 C    1  4000 
5 D  2000 2  2000 
6 E    2  2000 
7 E    2  2000 
8 F  1000 3  1000 
9 G  2000 4  2000 
10 G  3000 5  3000 
11 G  5000 6  5000 
12 G    6  5000 
संबंधित मुद्दे