2016-10-19 9 views
0

最初のステートメントは、私が働く組織のニーズに基づいて最小行を引き出す必要がある方法です。最初はMIN(DATEFIELD)でしたが、誰かが同じ日に2つのエントリを持っていれば、私たちには問題がありました。次に、MIN(OP__DOCID)を試しましたが、OP__DOCIDはテーブルの一意のキーです。ここで問題となるのは、誰かが作成したことを忘れてしまったエントリを過去に日付を記入した場合、結果が不正確になることです。だから、私は以下の声明を思いついた。それは私が各ユニークな入場から最新の結果を得ることを保証します。最大行を取得する2つの異なる方法

SELECT OP__DocID 
FROM FD__CNSLG_BASIS24 AS PC1 
WHERE (OP__DOCID = 
     (SELECT TOP(1)OP__DocID 
      FROM FD__CNSLG_BASIS24 AS PC2 
      WHERE PC2.ClientKey = PC1.Clientkey and PC2.ProgramAdmitKey = PC1.Programadmitkey 
      ORDER BY Date_Screening 
     ) 
    ) 

最近、私はおよそOVER(PARTITION BY)を学んだし、それがv.s.をどのように動作するかの微妙な違いにと好奇心てきました私は別の結果を得るため、上記のステートメント。

SELECT OP__DocID = Min(OP__DOCID) OVER (Partition BY Clientkey, Programadmitkey) 
FROM FD__CNSLG_BASIS24 

私が読むことができる洞察、または他のページへのリンクは非常に役に立ちます。

ありがとうございます!

+0

データの構造、サンプルデータ、および2つのクエリ間にどのような相違点がありますか?また、希望の結果が何であるかを伝えることができれば便利です。 – Insac

+0

また、使用しているrdbms(sqlserver、mysql、...)で質問にタグを付けることができます – Insac

+0

不足している情報については残念です。私が探していたものにゴードンが下に投稿したものがヒットしました。望ましい結果は、第1の記録を検索することであった。私はまた、最新のレコードを取得しようとしています(これが上記のMINの代わりにMAXでタイプミングされた理由です)。 違いは、certianレコードは最初のスクリプトには表示されますが、2番目のスクリプトには表示されず、逆もあります。その唯一の手がいっぱいなので、私はそれがそのレコードにユニークなものかもしれないと思っています...それはそれぞれを見なければならないことを意味します:/ –

答えて

1

ただ、ウィンドウ関数を使用します。

select pc.* 
from (select pc.*, 
      row_number() over (partition by Clientkey, ProgramAdmitKey 
           order by Date_Screening -- do you mean DESC? 
           ) as seqnum 
     from FD__CNSLG_BASIS24 PC 
    ) pc 
where seqnum = 1; 

注:これは、スクリーニング日付に基づいて最初のレコードを取得します。最新の情報を得るにはDESCが必要な場合があります。

+0

OH! OVER()関数で 'order by'を使うことができます。 row_Numberは 'order by'が動作する唯一の方法ですか? MIN(OP__DOCID)と一緒に使ってみるとエラーが出ました。 –

+0

また、元のスクリプトで、MINを入れようとしていた「MAX」と言って、間違いました。 –

+0

@J_Lyne Min(op_docid)と言うと、フィールドop_docidの最小値が返されるので、別のフィールドは冗長で受け入れられません。 MIN/MAXの代わりにLAST_VALUE/FIRST_VALUEを使用してみてください。 – Insac

0

私の解決策は、私は(1)ROW_NUMBER()関数に対してSELECT TOPに戻って代わりたい

好奇心旺盛だったが、私はレポートを取得するために必要なもの、そして、このためのものです私が必要とするものを提供する。誰もが助けてくれてありがとう。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
BEGIN 
    SET NOCOUNT ON; 

Declare 
@StartDate Date, 
@EndDate Date 

SET @StartDate = '1/1/2016' 
SET @EndDate = '6/1/2016' 

WITH CNSL_Clients AS (
       SELECT PC_CNT.Clientkey, PC_Cnt.ProgramAdmitKey, PC_Cnt.OP__DOCID 
       FROM FD__Primary_Client as PC_Cnt 
           INNER JOIN VW__Cnsl_Session_Count_IndvFamOnly as cnt 
            ON PC_Cnt.Clientkey = CNT.Clientkey AND PC_Cnt.ProgramAdmitKey = CNT.ProgramAdmitKey 
       WHERE ((pc_CNT.StartDate between @StartDate AND @EndDate) OR (pc_CNT.StartDate <= @StartDate AND pc_CNT.ENDDate >= @StartDate) OR (pc_CNT.StartDate <= @StartDate AND pc_CNT.ENDDate is null)) 
       AND CNT.SessionCount>=6 
), 

FIRST_BASIS AS (
      SELECT CB24_1.OP__DOCID, CB24_1.Date_Screening, CB24_1.ClientKey, CB24_1.ProgramAdmitKey, CB24_1.Composite_score, CB24_1.Depression_Results,CB24_1.Emotional_Results, CB24_1.Relationships_Results 
      FROM FD__CNSLG_BASIS24 AS CB24_1 
      WHERE (CB24_1.OP__DOCID = 
        (Select TOP(1) CB24_2.OP__DOCID 
        FROM FD__CNSLG_BASIS24 AS CB24_2 
             Inner JOIN CNSL_Clients 
              ON CB24_2.ClientKey = CNSL_Clients.ClientKey AND CB24_2.ProgramAdmitKey = CNSL_Clients.ProgramAdmitKey 
        WHERE (CB24_1.ClientKey = CB24_2.ClientKey) AND (CB24_1.ProgramAdmitKey = CB24_2.ProgramAdmitKey) 
        ORDER BY CB24_2.Date_Screening)) 
), 

RECENT_BASIS AS (
      SELECT CB24_1.OP__DOCID, CB24_1.Date_Screening, CB24_1.ClientKey, CB24_1.ProgramAdmitKey, CB24_1.Composite_score, CB24_1.Depression_Results,CB24_1.Emotional_Results, CB24_1.Relationships_Results 
      FROM FD__CNSLG_BASIS24 AS CB24_1 
      WHERE (CB24_1.OP__DOCID = 
        (Select TOP(1) CB24_2.OP__DOCID 
        FROM FD__CNSLG_BASIS24 AS CB24_2 
             Inner JOIN CNSL_Clients 
              ON CB24_2.ClientKey = CNSL_Clients.ClientKey AND CB24_2.ProgramAdmitKey = CNSL_Clients.ProgramAdmitKey 
        WHERE (CB24_1.ClientKey = CB24_2.ClientKey) AND (CB24_1.ProgramAdmitKey = CB24_2.ProgramAdmitKey) 
        ORDER BY CB24_2.Date_Screening DESC)) 
) 

SELECT F.OP__DOCID AS First_DOCID,R.OP__DOCID as Recent_DOCID,F.ClientKey, F.ProgramAdmitKey, F.Composite_Score AS FComposite_Score, R.Composite_Score as RComposite_Score, Composite_Change = R.Composite_Score - F.Composite_Score, F.Depression_Results AS FDepression_Results, R.Depression_Results AS RDepression_Resluts, Depression_Change = R.Depression_Results - F.Depression_Results, F.Emotional_Results AS FEmotional_Resluts, R.Emotional_Results AS REmotionall_Reslu, Emotional_Change = R.Emotional_Results - F.Emotional_Results, F.Relationships_Results AS FRelationships_Resluts, R.Relationships_Results AS RRelationships_Resluts, Relationship_Change = R.Relationships_Results - F.Relationships_Results 
FROM First_basis AS F 
     FULL Outer JOIN RECENT_BASIS AS R 
      ON F.ClientKey = R.ClientKey AND F.ProgramAdmitKey = R.ProgramAdmitKey 
ORDER BY F.ClientKey 
END 
GO 
関連する問題