81

SQL の Group By ステートメントに含まれていない非集計列を選択する方法についていくつかの情報を見つけようとしていますが、これまでに見つけたものは何も私の質問に答えていないようです。そこから必要な3つの列を持つテーブルがあります。1 つは作成日、もう 1 つは特定のクレーム ID でレコードをグループ化する ID、最後は PK です。クレーム ID の各グループで作成日が最大のレコードを見つけたいです。MAX(作成日)とクレーム ID(cpe.fmgcms_cpeclaimid)を選択し、クレーム ID でグループ化しています。しかし、これらのレコード (cpe.fmgcms_claimid) からの PK が必要であり、それを select 句に追加しようとすると、エラーが発生します。そして、それを group by 句に追加することはできません。これは、意図したグループ化が失われるためです。誰かがこれに対する回避策を知っていますか? これが私のコードのサンプルです:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid

これは私が得たい結果です:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, cpe.fmgcms_claimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid
4

7 に答える 7

57

句を含むselectクエリの結果セットの列は、次のようにする必要があります。group by

  • 条件の 1 つとして使用される式group by、または ...
  • 集約関数、または...
  • リテラル値

したがって、単一の単純なクエリでやりたいことを行うことはできません。最初にすべきことは、次のように明確な方法で問題を説明することです。

請求テーブルの各グループ内で、最新の作成日を含む個々の請求行を検索したい

与えられた

create table dbo.some_claims_table
(
  claim_id     int      not null ,
  group_id     int      not null ,
  date_created datetime not null ,

  constraint some_table_PK primary key ( claim_id                ) ,
  constraint some_table_AK01 unique    ( group_id , claim_id     ) ,
  constraint some_Table_AK02 unique    ( group_id , date_created ) ,

)

最初に、各グループの最新の作成日を特定します。

select group_id ,
       date_created = max( date_created )
from dbo.claims_table
group by group_id

これにより、要件の最初の部分 (各グループから個々の行を選択する) を満たすために必要な選択基準 (グループごとに 1 行、2 つの列: group_id と作成された最高値) が得られます。最終的なselectクエリ:

select *
from dbo.claims_table t
join ( select group_id ,
       date_created = max( date_created )
       from dbo.claims_table
       group by group_id
      ) x on x.group_id     = t.group_id
         and x.date_created = t.date_created

テーブルが(AK02)date_created内で一意でない場合group_id、特定のグループの重複する行を取得できます。

于 2012-08-16T16:45:15.117 に答える
27

PARTITIONと でこれを行うことができますRANK

select * from
(
    select MyPK, fmgcms_cpeclaimid, createdon,  
        Rank() over (Partition BY fmgcms_cpeclaimid order by createdon DESC) as Rank
    from Filteredfmgcms_claimpaymentestimate 
    where createdon < 'reportstartdate' 
) tmp
where Rank = 1
于 2012-08-16T15:57:23.213 に答える
10

直接的な答えは、できないということです。集約またはグループ化するもののいずれかを選択する必要があります。

したがって、別のアプローチが必要です。

1)。現在のクエリを取得し、ベース データを結合して戻します

SELECT
  cpe.*
FROM
  Filteredfmgcms_claimpaymentestimate cpe
INNER JOIN
  (yourQuery) AS lookup
    ON  lookup.MaxData           = cpe.createdOn
    AND lookup.fmgcms_cpeclaimid = cpe.fmgcms_cpeclaimid

2)。CTE を使用してすべてを一度に行う...

WITH
  sequenced_data AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARITION BY fmgcms_cpeclaimid ORDER BY CreatedOn DESC) AS sequence_id
  FROM
    Filteredfmgcms_claimpaymentestimate
  WHERE
    createdon < 'reportstartdate'
)
SELECT
  *
FROM
  sequenced_data
WHERE
  sequence_id = 1

注: を使用ROW_NUMBER()すると、fmgcms_cpeclaimid. createdon複数のレコードがまったく同じ値で関連付けられている場合でも。同順位の可能性があり、すべてのレコードに同じcreatedon値が必要な場合は、RANK()代わりに使用します。

于 2012-08-16T15:59:58.910 に答える
5

joinテーブル自体で PK を取得できます。

Select cpe1.PK, cpe2.MaxDate, cpe1.fmgcms_cpeclaimid 
from Filteredfmgcms_claimpaymentestimate cpe1
INNER JOIN
(
    select MAX(createdon) As MaxDate, fmgcms_cpeclaimid 
    from Filteredfmgcms_claimpaymentestimate
    group by fmgcms_cpeclaimid
) cpe2
    on cpe1.fmgcms_cpeclaimid = cpe2.fmgcms_cpeclaimid
    and cpe1.createdon = cpe2.MaxDate
where cpe1.createdon < 'reportstartdate'
于 2012-08-16T15:58:52.857 に答える
2

Thing I like to do is to wrap addition columns in aggregate function, like max(). It works very good when you don't expect duplicate values.

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, MAX(cpe.fmgcms_claimid) As fmgcms_claimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid
于 2020-06-02T12:13:23.987 に答える
-1

あなたが求めているのは、RedFilter の答えです。この回答も、group by がどういうわけか単純なバージョンまたはパーティション オーバーである理由を理解するのに役立ち ます戻ることはできません。

于 2013-04-30T14:31:07.380 に答える