2016-04-29 15 views
0

私は他の項目を取得するためにGROUP BYを使用する必要がないクエリを作成しようとしていますが、データを行に分割します。ここで私は何が実行されているが、同じの複数の行を取得しているpatient_idlast_servicelast_paymentは、同じ行に表示されません。私は彼らが分割するように見える3行をlast_servicelast_payment、そして両方がNULLである行にしています。ここに私のクエリは次のとおりです。同じ識別子の複数の行

WITH adj_rep_les AS(
SELECT DISTINCT t.clinic, t.patient_id, a.adj_desc 
FROM transactions t 
LEFT JOIN adjustments a 
    ON(t.clinic=a.clinic AND a.adjustment_id=t.adjustment_id) 
WHERE a.adj_desc LIKE '%TAB%' 
AND time_ran > '2016-03-27') 

SELECT DISTINCT 
     c.clinic_id, 
     w.patient_id, 
     p.city, 
     p.state, 
     p.zipcode, 
     SUM(t.amount) OVER (PARTITION BY w.clinic, w.patient_id) AS balance, 
     CASE WHEN t.impacts='P' THEN FIRST_VALUE(t.date_entered) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) END AS last_service, 
     CASE WHEN t.impacts='C' THEN FIRST_VALUE(t.date_entered) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) END AS last_payment, 
     FIRST_VALUE(s.description) OVER (PARTITION BY w.clinic, w.patient_id ORDER BY t.date_entered DESC) AS service_done 

FROM adj_rep_les w 
LEFT JOIN clinic_master c 
    ON (w.clinic=c.clinic) 
LEFT JOIN patient p 
    ON (w.clinic=p.clinic AND w.patient_id=p.patient_id) 
LEFT JOIN transactions t 
    ON (w.clinic=t.clinic AND w.patient_id=t.patient_id) 
LEFT JOIN services s 
    ON (t.clinic=s.clinic AND t.service_code=s.service_code) 

任意の考え?私はまた、t.impactsのフィルタを無視しているかのように、CASE内のFIRST_VALUEが動作しておらず、同じ結果を与えているようには思えません。あるいはケース内MAX(t.date_entered)を使用して試みたが、それが原因MAX集約関数である

サンプルデータ結果にGROUP BYを必要とする:予め Sample Data

おかげ。問題の

+0

サンプルデータとddlが提供されていないため、ちょうど推測です。 WHEN t.impactsの= 'P' THEN FIRST_VALUE(t.date_entered)OVER(PARTITION t.date_entered DESC BY w.clinic、w.patient_id ORDER BY)last_service AS END、 CASE t.impactsの= 'C動き 'CASEを試します「CTEにAS last_payment END、 'THEN FIRST_VALUE(t.date_entered)OVER(t.date_entered DESC BY ORDERをw.patient_id、w.clinic BY PARTITION)とCTEでそれらを旋回し、そしてメインSELECTで取引に参加するドロップします。 – Serg

答えて

3

いくつかは以下のとおりです。

  • あなただけの患者ごとに一つのレコードをしたいだろうが、トランザクションあたりのレコード内transactions結果と結合します。これを解決するには、サブクエリでトランザクションの選択を実行し、そこから患者ごとに1レコードをフィルタリングすることができます。
  • CASEのコンストラクトは、両方の条件を同時に真にすることはできないため、患者ごとに1つのレコードが必要なロジックを無効にします。代わりに、これらのCASEの構築物は、いくつかの集合の中に表示されます。問題の

控除:INNER JOINが同じ結果を持っていることは明らかです

  • あなたが場所でLEFT JOINを使用しています。後者は一般的にパフォーマンスが良いので、可能であれば使用することをお勧めします。
  • adj_descをCTEの外部に使用しないので、SELECTの必要はありません。
  • は、あなたが既に持っている主キーの値よりも他の何かのためにmaster_clinicテーブルを使用していないので、私はあなたが出て、そのテーブルを残すことができると思います。
  • 参照整合性のために列を使用しますが、clinic_idを選択してください。私はこれがタイプミスだと思う。ここで

私は示唆しているクエリです:

WITH adj_rep_les AS (
    SELECT DISTINCT t.clinic, t.patient_id 
    FROM  transactions t 
    INNER JOIN adjustments a 
      ON t.clinic=a.clinic 
      AND a.adjustment_id=t.adjustment_id 
    WHERE  a.adj_desc LIKE '%TAB%' 
    AND  time_ran > '2016-03-27') 
SELECT DISTINCT 
      w.clinic, 
      w.patient_id, 
      p.city, 
      p.state, 
      p.zipcode, 
      x.balance, 
      x.last_service, 
      x.last_payment, 
      x.service_done 
FROM  adj_rep_les w 
INNER JOIN patient p 
     ON w.clinic=p.clinic 
     AND w.patient_id=p.patient_id 
INNER JOIN (
      SELECT  t.clinic, 
         t.patient_id, 
         SUM(t.amount) 
          OVER (PARTITION BY t.clinic, t.patient_id) AS balance, 
         MAX(CASE WHEN t.impacts='P' THEN t.date_entered END) 
          OVER (PARTITION BY t.clinic, t.patient_id) AS last_service, 
         MAX(CASE WHEN t.impacts='C' THEN t.date_entered END) 
          OVER (PARTITION BY t.clinic, t.patient_id) AS last_payment, 
         ROW_NUMBER() 
          OVER (PARTITION BY t.clinic, t.patient_id 
           ORDER BY t.date_entered DESC) AS rn, 
         s.description AS service_done 
      FROM  transactions t 
      LEFT JOIN services s 
        ON t.clinic=s.clinic 
        AND t.service_code=s.service_code) as x 
     ON w.clinic=x.clinic 
     AND w.patient_id=x.patient_id 
     AND rn = 1 

rn = 1条件はあなたがtransactionテーブルから、正確に一つのレコード、所定の患者や診療所のための最も最近のdate_entered持つものを得ることを確認できます。

+0

@OM Asphyxiate、これで問題は解決しましたか?フィードバックをお願いできますか? – trincot

+0

これは確かに私が望んでいたように機能していたようです。私はまだSQLをかなり新しくしており、これまでに学んだことが原因です。私はすべての助けと問題の洞察に感謝します。 –

+0

ようこそ。新しい質問を投稿するのをためらうことはありません! – trincot

関連する問題