sql-server - SQL में पंक्तियों का चयन करें जहां वर्तमान स्तंभ मान पिछले मान से मेल नहीं खाता है




sql-server-2012 (3)

lag() प्रयोग करें lag() :

select o.*
from (select o.*,
             lag(shippingcountry) over (partition by customerid order by orderdate) as prev_shippingcountry
      from orders o
     ) o
where prev_shippingcountry <> shippingcountry ;

मेरे पास आदेश की मेज है इस तालिका में, अन्य पंक्तियों के बीच, मेरे पास एक आईडी (पीके), ग्राहक आईडी, शिपिंग देश और ऑर्डर की तारीख है

ID   | CustomerId | ShippingCountry | OrderDate
1    | 111111     | DE              | 2016-08-13
2    | 222222     | GB              | 2016-08-17
3    | 111111     | ES              | 2016-09-05
4    | 333333     | ES              | 2016-10-25
5    | 444444     | US              | 2016-10-26
6    | 555555     | FR              | 2016-10-29
7    | 666666     | DE              | 2016-11-04
8    | 111111     | DE              | 2016-11-12
9    | 222222     | US              | 2016-12-01
10   | 444444     | GB              | 2016-12-01
11   | 555555     | FR              | 2016-12-05
12   | 333333     | ES              | 2016-12-15

मुझे उन पंक्तियों का चयन करना होगा जहां ग्राहक का पिछला आदेश उनके नवीनतम आदेश के शिपिंग देश से मेल नहीं खाता है। मैं परिणाम में 2 भिन्न शिपिंग कोड देखना चाहता हूं।

उपरोक्त उदाहरण का उपयोग करना, मुझे यह देखना है:

CustomerId | ShippingCountryLatest | ShippingCountryPrevious
111111     | DE                    | ES
222222     | US                    | GB
444444     | GB                    | US

चीजों के क्रम को निर्धारित करने के लिए आईडी और ऑर्डर डेट का उपयोग किया जा सकता है आईडी एक बढ़ते संख्या है, आदेश दिनांक है जैसा कि कहते हैं।

इस तालिका को चलाने के लिए मुझे लगभग 500k पंक्तियाँ हैं

कोई सुझाव?

आपको आरंभ करने के लिए यहां एक SQLFiddle है: http://sqlfiddle.com/#!6/5d046/1/0


नवीनतम रिकॉर्ड # 1 और पिछला # 2 प्रति ग्राहक देने के लिए ROW_NUMBER का उपयोग करें फिर प्रति ग्राहक कुल और दो मूल्यों की तुलना करें।

select 
  CustomerId,
  max(case when rn = 1 then ShippingCountry end) as ShippingCountryLatest, 
  max(case when rn = 2 then ShippingCountry end) as ShippingCountryPrevious
from
(
  select 
    CustomerId,
    ShippingCountry,
    row_number() over (partition by CustomerId order by ID desc) as rn
  from orders
) numbered
group by customerid
having
  max(case when rn = 1 then ShippingCountry end) <>
  max(case when rn = 2 then ShippingCountry end);

आपका बैकल बैक: http://sqlfiddle.com/#!6/5d046/13 :-)


शायद आपको यह आसान लगता है

select * from (
    select ssn, sum(time) from downloads
    group by ssn
    order by sum(time) desc
) where rownum <= 10 --top 10 downloaders

सादर
कश्मीर





sql sql-server sql-server-2012