6

私のテーブルは、複数の日とチャンネルのスケジュールされたテレビ番組のリストです。

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

私が作成しようとしている結果セットは、What's on Now と What's on Next です。

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

私は、チャネルごとに個別のクエリをハードコーディングせずにこれを行うための最善の方法について頭を悩ませてきました。私は今、考えすぎの段階にあると思うので、誰かが私を正しい方向に向けることができれば素晴らしいと思います.

ありがとう

PS: 違いがあれば、私は Microsoft SQL Server 2012 を使用しています

4

5 に答える 5

3

これは本当にGIUをフォーマットしてピボットさせるもののように見えますが、これが私の試みです。

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

編集:ここでは時間を使用していますが、日付を追加するだけです。日付と時刻の列を組み合わせることを実際に検討する必要があります。

Edit2:日付を追加するには、これと比較して時間を置き換えるだけです。日付の境界を越えても機能するはずです。

WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) > '19/09/2012 07:15'
于 2012-09-18T12:32:46.330 に答える
2

これがSQLFiddleの例です。このクエリは、プログラムが前日に開始して現在で終了する場合、または現在で開始して翌日に終了する場合にもうまく機能します(NOWおよびNEXTの結果の場合)。

現在の日付については、:に置き換えてくださいcast('09/19/2012 07:15' as datetime)CURRENT_TIMESTAMP

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;
于 2012-09-18T13:16:55.780 に答える
0

データを取得してクロス集計するには、次を使用します。最初の選択でチャネル列の名前を変更できますが、ピボットリストで有効なチャネルを指定する必要があります。

Nb日付と時刻のフィールドを単一の日時フィールドに結合することにより、コードを簡略化できます。

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
于 2012-09-18T12:24:13.670 に答える
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

私は試していませんが (現時点では SQL Server が利用できないため)、これは機能するはずです。

于 2012-09-18T12:09:46.203 に答える
0

別の可能なオプション - 時間差を計算し、最小の +ve 値 (次) と最小の -ve 値 (現在) をフェッチします - DATE & TIME タイプのフィールドを想定し、開始から開始までの分も返します。

;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 
于 2012-09-18T13:53:24.717 に答える