मुझे किसी ग्राहक द्वारा वर्तमान बुकिंग तक की गई पिछली बुकिंग की संख्या गिननी है। वांछित आउटपुट के लिए नीचे देखें।

HotelID RoomID BookingID PrevBookingCount  
H6  R8  G3  B1  0  
H6  R2  G5  B2  0  
H6  R7  G1  B3  0  
H10 R4  G7  B4  0  
H10 R9  G2  B5  0  
H13 R1  G11 B6  0  
H13 R8  G1  B7  1  
H13 R5  G5  B8  1  
H13 R3  G1  B9  2  

तीसरा कॉलम GuestID को दर्शाता है। यह वह फ़ील्ड है जिसे पिछली बुकिंग निर्धारित करने के लिए गिना जाना चाहिए। उदाहरण के लिए, Booking B3 (पंक्ति 3) में GuestID G1 देखें। इस ग्राहक ने पहली बुकिंग B1. पिछली बुकिंग शून्य होनी चाहिए। बुकिंग B7 फिर से अतिथि G1 द्वारा की जाती है, लेकिन अब इस ग्राहक के पास एक पिछली बुकिंग है। इसी तरह बुकिंग के लिए B9.

तालिका को PrevBookingCount के साथ NULL पर सेट करके बनाया गया है, और परिणाम देने के लिए एक अद्यतन या परिवर्तन तालिका विवरण का उपयोग किया जाना चाहिए।

create table bookings
(HotelID varchar(4),
RoomID varchar(4),
BookingID varchar(4),
PrevBookingCount int)

insert into bookings
values('H6','R8','G3','B1',NULL)
values('H6','R2','G5','B2',NULL)
...
values('H13','R3','G1','B9',NULL)

मेरा निम्नलिखित (खराब) प्रयास प्रत्येक रिकॉर्ड के लिए समान मूल्य (6) प्राप्त करता है।

update bookings
set PrevBookingCount = count(distinct GuestID)

क्या कोई पुनरावृत्त दृष्टिकोण या एक उपश्रेणी है जो परिणाम दे सकती है?

-1
5j4rk0 9 अप्रैल 2020, 11:59

1 उत्तर

सबसे बढ़िया उत्तर

SQL तालिकाएं अनियंत्रित सेट का प्रतिनिधित्व करती हैं। "पिछली बुकिंग" जैसी कोई चीज़ नहीं होती है, जब तक कि कोई कॉलम वह जानकारी प्रदान न करे। मैं अनुमान लगाता हूं कि bookingid ऐसा करता है।

फिर, मैं row_number() का उपयोग करने की सलाह देता हूं:

select b.*,
       row_number() over (partition by guestid order by bookingid) - 1 as PrevBookingCount
from bookings b;

मुझे इसे तालिका में एक अलग कॉलम के रूप में रखने का कोई कारण नहीं दिखता, क्योंकि इसकी गणना आसानी से की जा सकती है।

हालाँकि, यदि आप वास्तव में ऐसा करना चाहते हैं, तो मानक SQL सिंटैक्स होगा:

update bookings
    set PrevBookingCount = (select count(*)
                            from bookings b2
                            where b2.GuestID = b.GuestId and
                                  b2.BookingId < b.BookingId
                           );

यह अनावश्यक रूप से महंगा लगता है और अगले डेटाबेस परिवर्तन के साथ पुराना हो जाएगा।

0
Gordon Linoff 9 अप्रैल 2020, 11:50