2012-09-18 7 views
6

मेरी तालिका कई दिनों और चैनलों के लिए अनुसूचित टीवी कार्यक्रमों की एक सूची है।अब और अगला टीवी कार्यक्रम जानकारी SQL क्वेरी

SELECT * FROM [Scheduled_Programmes] 

Channel Date   Time  Title 
1   2012-09-19 06:00 Family Guy 
2   2012-09-19 06:01 CSI Miami 
3   2012-09-19 06:20 News 
1   2012-09-19 06:30 Heroes 
2   2012-09-19 07:01 Spiderman 
3   2012-09-19 06:40 Batman 
1   2012-09-19 07:30 Micky Mouse 
2   2012-09-19 07:31 CSI New York 
3   2012-09-19 07:10 Friends 
1   2012-09-19 07:55 The Wire 
2   2012-09-19 08:00 Dodgeball 
3   2012-09-19 07:35 Gossip Girl 

परिणाम सेट जो मैं बनाने की कोशिश कर रहा हूं वह अब क्या है और व्हाट्स ऑन नेक्स्ट।

Let's assume the current datetime is (D/M/Y HH:MM) 19/09/2012 07:15 

तो जैसे कुछ:

  Channel 1  Channel 2  Channel 3 
NOW  Heroes  Spiderman  Friends 
NEXT  Micky Mous CSI New York Gossip Girl 

मैं मुश्किल कोड को प्रत्येक चैनल के लिए एक व्यक्ति क्वेरी बिना यह करने के लिए सबसे अच्छा तरीका है के लिए मेरे मस्तिष्क रैकिंग किया गया है। मुझे लगता है कि अब यह पर इस पर विचार कर रहा है, तो अगर कोई मुझे सही दिशा में इंगित कर सकता है तो यह बहुत अच्छा होगा।

धन्यवाद

पुनश्च: यह एक फर्क मैं Microsoft SQL सर्वर 2012

उत्तर

3

यह वास्तव में ऐसा लगता है जो आप अपने जीआईयू प्रारूप और पिवट को छोड़ देंगे लेकिन यहां पर मेरा जाना है।

SELECT * FROM (
    SELECT * FROM (
     SELECT X.Status, X.Channel, X.Title FROM (
     SELECT 'NOW' as Status, Channel, Title, RANK() OVER (PARTITION BY Channel ORDER BY Time DESC) RANKED FROM Sceduled_Programs SP 
     WHERE DateTime <= '7:15') X 
     WHERE X.RANKED = 1 
    ) A 
    UNION ALL 
     SELECT * FROM (
     SELECT Y.Status, Y.Channel, Y.Title FROM (
     SELECT 'NEXT' as Status, Channel, Title, RANK() OVER (PARTITION BY Channel ORDER BY Time ASC) RANKED FROM Sceduled_Programs SP 
     WHERE DateTime > '7:15') Y 
     WHERE Y.RANKED = 1 
    ) B 
) DataToPivot 
PIVOT (MAX(Title) FOR Channel IN ([1], [2], [3])) AS PivotTable 

संपादित करें: मैं केवल समय यहाँ का उपयोग कर रहा हूँ, लेकिन अभी तिथि जोड़ते हैं। आपको वास्तव में दिनांक और समय कॉलम को संयोजित करने पर विचार करना चाहिए।

संपादित 2: तिथि जोड़ने के लिए बस उस समय की तुलना करें। तारीख सीमाओं पर भी काम करना चाहिए।

WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) > '19/09/2012 07:15' 
+0

शानदार! आपको बहुत - बहुत धन्यवाद! मेरे पास एक संयुक्त तिथि/समय कॉलम है, हालांकि यह "वास्तविक" संचरण समय के लिए है, न कि टीवी गाइड शैली समय/दिनांक जो मैं यहां उपयोग कर रहा हूं। (उदाहरण: 18:00:00 बनाम 18:02:13) इसके अलावा, मैं मानता हूं कि इनमें से कुछ जीयूआई में किया जा सकता है, लेकिन मुझे पता था कि यह एसक्यूएल में किया जा सकता है और यह मुझे पागल कर रहा था। धन्यवाद – pugu

0
select distinct Channel 
, (
select top 2 Title from 
     (
     select Title 
     from [Scheduled_Programmes] s 
     where s.Channel = o.Channel 
     and Date >='2012-09-19' and Time >='07:15' 
     group by Channel 
     order by Date, Time desc 
     ) x 
) as Prog 
from [Scheduled_Programmes] o 

मैं इसे (इस बिंदु पर एसक्यूएल सर्वर की अनुपलब्धता के कारण) प्रयास नहीं किया है पर हूँ करता है, लेकिन अगर यह कार्य करना चाहिए।

+0

आप नहीं 'अदिश संदर्भ में शीर्ष 2' का चयन कर सकते – Andomar

+0

धन्यवाद, यह भी बाहर कुल किसी तरह का में शीर्षक युक्त द्वारा आदेश पसंद नहीं आया। – pugu

0

डेटा और क्रॉस-टैब प्राप्त करने के लिए यह निम्न का उपयोग करता है। आप पहले चयन में चैनल कॉलम का नाम बदल सकते हैं, लेकिन आपको पिवोट सूची में मान्य चैनल निर्दिष्ट करना होगा।

एनबी। दिनांक और समय फ़ील्ड को एक डेटाटाइम फ़ील्ड में जोड़कर कोड को सरल बनाया जा सकता है।

declare @current_date datetime = '20120919 07:15' 

select * 
from (
    select whenon, a1.channel, title from (
    select a.channel, MAX(CAST(Date AS DATETIME) + CAST(Time AS DATETIME)) as DateTime, 'now' as whenon 
    from Scheduled_Programmes a 
    join (
    select channel, MIN(CAST(Date AS DATETIME) + CAST(Time AS DATETIME)) as NextTime 
    from Scheduled_Programmes 
    where CAST(Date AS DATETIME) + CAST(Time AS DATETIME) > @current_date 
    group by channel 
) b on a.channel = b.channel and CAST(Date AS DATETIME) + CAST(Time AS DATETIME) < NextTime 
    group by a.channel 
    union 
    select channel, MIN(CAST(Date AS DATETIME) + CAST(Time AS DATETIME)), 'next' from Scheduled_Programmes where CAST(Date AS DATETIME) + CAST(Time AS DATETIME) > @current_date 
    group by channel 

) a1 
    join Scheduled_Programmes b1 on a1.channel = b1.channel and a1.DateTime = CAST(Date AS DATETIME) + CAST(Time AS DATETIME) 
) sub 
pivot (max(title) for channel in ([1], [2], [3])) pivottable 
order by whenon desc 
+0

धन्यवाद, मैं इस कोड के साथ भी प्रयोग करूंगा। – pugu

+0

चीयर्स, यह सभी मामलों में काम करता है बस थोड़ा बदसूरत दिखता है क्योंकि मैंने इसे किसी कारण से सीटीई या रैंक() के बिना किया था! –

2

यहां SQLFiddle example है। यह क्वेरी भी ठीक से काम करती है यदि कोई प्रोग्राम पिछले दिन शुरू होता है और वर्तमान में समाप्त होता है या वर्तमान में शुरू होता है और अगले दिन (अब और NEXT परिणामों के लिए) में समाप्त होता है।

आज की तारीख के लिए सिर्फ CURRENT_TIMESTAMP साथ cast('09/19/2012 07:15' as datetime) बदल देते हैं:

with T as 
(select channel, title, 
     (date+cast(Time as datetime)) as D_Time 
     from Scheduled_Programmes 
) 

select nn, 
    max(CASE when channel=1 then Title end) as Chanel1, 
    max(CASE when channel=2 then Title end) as Chanel2, 
    max(CASE when channel=3 then Title end) as Chanel3 


from 
(
select 'NOW' nn,Channel,Title,D_time, 
    row_number() over (PARTITION by channel 
         order by D_time desc) rn 
    from T 
    where D_time<=cast('09/19/2012 07:15' as datetime) 
union 
select 'NEXT'nn,Channel,Title,D_time, 
    row_number() over (PARTITION by channel 
         order by D_time asc) rn 
    from T 
    where D_time>cast('09/19/2012 07:15' as datetime) 
) ATable where rn=1 
group by nn 
order by nn desc; 
+0

उपरोक्त मैग्नस उदाहरण 'अगली' प्रोग्राम को संभाल नहीं सकता है अगर यह दिनांक सीमा पर है क्योंकि मैंने इसे कार्यान्वित किया है तो आगे टिंकर होगा और आपके कोड से परामर्श लेंगे। – pugu

0

एक अन्य संभावित विकल्प - समय अंतर की गणना & छोटी से छोटी + ve मूल्य (अगले) और छोटी-ve मूल्य (अब) लाने - DATE मान लिया गया है & समय प्रकार फ़ील्ड, शुरू होने/शुरू होने के बाद से मिनट भी लौटाता है।

;with T(Channel, Date, Time, Title, delta) as (
select 
    *, 
    datediff(minute, '19 sep 2012 07:15:00', dateadd(day, datediff(day, 0, date), cast(time as datetime2))) 
from 
    Scheduled_Programmes 
) 
select 
case when T.delta >= 0 then 'Next' else 'Now' end, 
T.* 
from T 
inner join (
    select 
     channel, 
     min(case when delta > 0 then delta end) as starts_in, 
     max(case when delta < 0 then delta end) as started 
    from t 
    group by channel 
) T2 
    on T.Channel = T2.Channel and (t.delta = T2.starts_in or t.delta=T2.started) 
order by Channel, delta