1

次の CTE 式があります。

WITH DocDetails_CTE 
 AS
(
SELECT   d.DocumentId,    
         dd.AutUser,           
        rank() over (order by d.DocumentId) as [r]
  FROM   Document d
         INNER JOIN DocumentItems di
                 ON d.DocumentId = di.DocumentId           
         INNER JOIN DocumentDetails dd
                 ON dd.DocumentDetailsId = di.DocDetailsId           
  )
  SELECT *
  FROM DocDetails_CTE

次の結果が返されます。

documentId| AuthUser |      [r]
-------------------------------
52  Derck       1
52  John        1
53  Niall       3
53  Bill        3
53  John        3
53  Andy        3
54  Rob         7
54  Noel        7

たとえば、新しいdocumentIdを持つ最初の行のみを取得するようにCTEを変更するにはどうすればよいですか

documentId| AuthUser |      [r]
-------------------------------
52  Derck       1    
53  Niall       3
54  Rob         7
4

1 に答える 1

1

「最初の行」が何を意味するかを決定する必要があります-必要な行を識別するためのまたはその他の方法をmin作成します。maxこれはアルファベット順に「最初」を返します:-

select cte.DocumentId, min(cte.AutUser) as AutUser, cte.[r]
from (
  SELECT   d.DocumentId,    
             dd.AutUser,           
            rank() over (order by d.DocumentId) as [r]
      FROM   Document d
             INNER JOIN DocumentItems di
                     ON d.DocumentId = di.DocumentId           
             INNER JOIN DocumentDetails dd
                     ON dd.DocumentDetailsId = di.DocDetailsId

) cte
group by cte.DocumentId, cte.[r]

または、2 つのウィンドウ関数をネストして、(潜在的に) ランダムなコードを再現できます。

select
    pass2.documentid, 
    pass2.autuser, 
    pass2.r
from (
    select
        pass1.*,
        row_number() over (partition by [r] order by documentid ) as rownumber
    from (
        select
            d.documentid,
            dd.autuser,
            rank() over (order by d.documentid) as [r]
        from document d
        join documentitems di on di.documentid = d.documentid           
        join documentdetails dd on dd.documentdetailsid = di.docdetailsid 
    ) pass1
) pass2
where pass2.rownumber=1
于 2013-11-06T00:36:20.157 に答える