0

Eligible Table [ET] には、Eligible [Eg] および Ineligible [In] のレコードがあります。各レコードには、1 つの日付のみが関連付けられています。サービス テーブル [ST] にカスタマー サービス [CS] があり、サービス日より前の直近のレコードの種類を特定する必要があります。


______________ET______________



Eg    01.01.2012  
In    01.20.2012  
Eg    01.29.2012  
In    02.10.2012  

_________________________ST______________________________  

CS  Joe Schmoe  02.01.2012 11:00 AM  
CS  Joe Schmoe  01.25.2012 1:00  PM  
CS  Harold Doe  02.09.2012 4:00  PM 

2012 年 1 月 1 日午前 11:00 の Joe Schmoe のサービスは、2012 年 1 月 1 日の適格レコードにより適格であり、Joe Schmoe は 2012 年 1 月 25 日の午後 1:00 のサービスは適格でないため不適格であったという事実を返したいと思います。記録は 2012 年 1 月 20 日で、Harold Schmoe は 2012 年 1 月 29 日の資格記録により、2012 年 9 月 2 日の午後 4 時にサービスを受ける資格がありました。

__ _ __ _ __ _ __結果_ __ _ _ __ _ __ _ _ _ __ _

Joe Schmoe 02.01.2012 11:00 AM 適格 01.01.2012
Joe Schmoe 01.25.2012 1:00 PM 不適格
Harold Doe 02.09.2012 02.09.2012 4:00 PM 不適格 01.29.2012

4

4 に答える 4

2

私はこのようにしました:

http://sqlfiddle.com/#!3/1c73b/5

select fname, etdate, 'eligible' as eligible
from st
where  etdate between 
(select max(etdate) from et where status ='Eg')
and
(select max(etdate) from et where status ='In')
union
select fname, etdate, 'ineligible' as eligible
from st
where  etdate not between 
(select max(etdate) from et where status ='Eg')
and
(select max(etdate) from et where status ='In')
order by 2
于 2012-06-01T19:57:02.723 に答える
2

applyこのために設計されました。

select
    ST.fName, stETD = ST.etDate, previousET.*
from
    ST
    outer apply (
        select top 1
            ET.Status,
            ET.ETDate
        from
            ET
        where
            ET.ETDate <= ST.etDate
        order by
            ET.ETDate desc
    ) previousET
order by
    2

http://sqlfiddle.com/#!3/1c73b/11

これにより、最新 ( order by ETDate desc) の進行中のレコード ( where ETDate <= ST.Date) が取得されます。フィドルのmikeYに感謝します。

于 2012-06-01T20:38:03.023 に答える
0

適格性はユーザーレベルではないため、これは奇妙な要求のように思えます。

次のクエリは、必要なことを行います。

select et.*, st.elibility, st.ETDate
from et cross join
     (select st.*
      from st join
           (SELECT MAX(cs.Date) as lastcsDate
            FROM st JOIN
                 et
                 ON st.Date <= et.Date
            GROUP BY cs.UserId
           ) t
           on st.date = t.lastcsDate
     ) lastst

注: タイプミスを許すために、このクエリを実行していません。

これは、相関サブクエリを使用して、et テーブル内の各日付以前の最新の日付を取得します。残りは、select 句の正しい情報に参加するだけです。

于 2012-06-01T19:45:34.110 に答える
0

適格性テーブルの UserId と Date に一意の制約があると仮定すると (それ以外の場合は、userid、date に row_number を追加するなど、別のタイブレーカーが必要になります)、次のようになります。

  • 関心のある日付 (CS 日付) より前の日付を持つすべてのレコードに結合します。
  • 次に、それらの日付の最大値を取得します (イベントの前の最後の日付が必要なため)。
  • その後、元のテーブルに JOIN して、残りの行の詳細 (ステータス タイプ) を取得します。これが、一意の制約が必要な理由です

SELECT
   UserId, Date, Status, ETDate
FROM (
    --The last matching status record by date
    SELECT ST.UserId, ST.Date, MAX(ET.Date) as ETDate
    FROM ST
    JOIN ET ON
       ST.UserId = ET.UserId
       AND CS.Date >= ET.Date
    GROUP BY
       ST.UserId, ST.Date
) as C
JOIN ET as E ON
    C.UserId = E.UserId
    AND C.ETDate = E.ETDate
于 2012-06-01T19:10:54.643 に答える