2017-08-30 3 views
3

後述するようにSQLクエリが出力を与えた後:私はn個確認したい。ここはどのようにSQLで前の行からの値を使用する

SELECT claim_id,person_id,service_date,readmission_in_60_days 
FROM xyz WHERE person_id IN("00026cb6","021fb6bd") GROUP BY person_id,service_date 
ORDER BY service_date ASC 



claim_id person_id service_date readmission_in_60_days 
    8  021fb6bd 2015-01-01    NULL 
    304  021fb6bd 2015-01-05    NULL 
    296  021fb6bd 2015-01-06    NULL 
    11888 021fb6bd 2015-01-07    NULL 
    23928 021fb6bd 2015-01-08    NULL 
    265442 00026cb6 2016-07-20    NULL 
    518062 00026cb6 2016-09-28    NULL 
    579739 00026cb6 2016-10-02    NULL 

特にperson_id.If差のためのn-1行service_date nとn-1 service_dateは60日未満です。n row column readmission_in_60_days = "TRUE"または "FALSE"。 SQLクエリから

所望の出力は次のようになります。あなたがEXISTSとサブクエリを使用することができます

claim_id person_id service_date readmission_in_60_days 
    8  021fb6bd 2015-01-01    FALSE 
    304  021fb6bd 2015-01-05    TRUE 
    296  021fb6bd 2015-01-06    TRUE 
    11888 021fb6bd 2015-01-07    TRUE 
    23928 021fb6bd 2015-01-08    TRUE 
    265442 00026cb6 2016-07-20    FALSE 
    518062 00026cb6 2016-09-28    FALSE 
    579739 00026cb6 2016-10-02    TRUE 
+0

。 –

+0

SQLの仕事はあまりありません。 MySQL変数を使用することは可能ですが、クライアントコードで行う方が簡単で速いと思います。どのような言語を使用していますか? – axiac

+0

@axiac私はSQLではなくETLを選択します。 – Gulshan

答えて

4

SELECT person_id, service_date, 
     (EXISTS (SELECT 1 
       FROM xyz xyz2 
       WHERE xyz2.person_id = xyz.personid AND 
         xyz2.service_date < xyz.service_date AND 
         xyz2.service_date >= DATE_SUB(xyz.service_date, INTERVAL 60 DAY) 
     ) as readmission_in_60_days 
FROM xyz 
WHERE person_id IN ('00026cb6', '021fb6bd') 
GROUP BY person_id, service_date 
ORDER BY service_date ASC 

注:私はclaim_idを削除しました。あなたはSELECTでそれを含めたい場合は、次のいずれか

  • GROUP BY
  • に追加し、そのようなMIN()MAX()、またはGROUP_CONCAT()として集計関数を使用します。
+0

これは望ましい出力を与えていません。 特定のperson_idの最初のケースは、事前にサービス日付がないため、常にFalseにする必要があります。 例。 '265442 00026cb6 2016-07-20 FALSE' – Gulshan

+0

@Gulshan。 。 。次に、 'date_add()'の代わりに 'date_sub()'を使います。 –

+0

まだ間違った出力 – Gulshan

4

これを試してください。

Declare @tblTest as table 
(
    claim_id int, 
    person_id varchar(50), 
    service_date datetime, 
    readmission_in_60_days varchar(10) null 
) 

insert into @tblTest values (304 , '021fb6bd','2015-01-05', NULL) 
insert into @tblTest values (296 , '021fb6bd','2015-01-06', NULL) 
insert into @tblTest values (11888 , '021fb6bd','2015-01-07', NULL) 
insert into @tblTest values (23928 , '021fb6bd','2015-01-08', NULL) 
insert into @tblTest values (265442, '00026cb6','2016-07-20', NULL) 
insert into @tblTest values (518062, '00026cb6','2016-09-28', NULL) 
insert into @tblTest values (579739, '00026cb6','2016-10-02', NULL) 

SELECT t.claim_id, 
    t.person_id, 
    t.service_date, 
    t.PreviousDate, 
    DATEDIFF(DAY, t.service_date, t.PreviousDate) AS TotalDiffDays, 
    CASE WHEN ISNULL(t.PreviousDate,'') = '' THEN 'FALSE' 
     WHEN DATEDIFF(DAY, t.PreviousDate, t.service_date) > 60 THEN 'FALSE' 
     WHEN DATEDIFF(DAY, t.PreviousDate, t.service_date) < 60 THEN 'TRUE' 
     END AS readmission_in_60_days 
FROM 
    (SELECT 
     claim_id, 
     person_id, 
     service_date, 
     LAG(service_date, 1, null) OVER (ORDER BY claim_id ASC) AS PreviousDate from @tblTest 
    ) t 
+0

エラーコード:1582 ネイティブ関数 'DATEDIFF'の呼び出しのパラメータカウントが正しくありません – Gulshan

+1

この回答はSQL Server用です。 Opフラグ付きMySQL –

1

代わりに、変数を使用してMySQLでLAG関数をエミュレートすることもできます。このような何か:

SET @prevdate = '1900-01-01'; 
SET @prevperson = ""; 

SELECT id, personid, servicedate, 
CASE WHEN prevperson = personid THEN 
    CASE WHEN datediff(servicedate,prevdate) > 60 THEN FALSE 
    ELSE TRUE END 
    ELSE FALSE END AS readmission_within_60_days 
FROM 
(SELECT id, personid, servicedate, 
@prevdate prevdate, 
@prevperson prevperson, 
@prevdate := servicedate as thisdate, 
@prevperson := personid as thisperson FROM xyz 
ORDER BY id, personid) t order by id, personid; 

編集

あなたは変数を使用できない場合は、あなたがであなたが欲しいものを得ることができます:あなたはあなたの結果を達成することができLAG関数の使い方

SELECT z.id, 
     z.personid, 
     z.servicedate, 
     CASE WHEN z.MaxPrevDate IS NULL 
      THEN FALSE 
     ELSE 
      CASE WHEN datediff(z.servicedate,z.maxprevdate) > 60 
       THEN FALSE 
      ELSE 
       TRUE 
      END 
     END as readmission_within_60_days 
FROM 
    (SELECT x.id, x.personid, x.servicedate, 
    (SELECT Max(servicedate) FROM xyz y 
    WHERE y.personid = x.personid AND y.id < x.id) AS maxPrevDate 
    FROM xyz x) z 
+0

変数を使用せずに解決策が必要です。正しい出力が得られますが、単一のクエリがあれば素晴らしいことでしょう。 – Gulshan

+0

@Gulshan変数を使用できない場合は、私の編集した提案を試してください。 –

関連する問題