3

最新の個別のレコードを取得する必要がある雑然としたデータが取り込まれているサード パーティのテーブルがあります。テーブルには、毎年、または「人」が変わるたびに新しい行が供給されます。テーブルは、最新の ActiveDate が正しい人であることに基づいて機能します。これを示すために、モック テーブルとデータを作成しました。

CREATE TABLE `Persons` (
  `PersonId` varchar(200) NOT NULL,
  `Name` varchar(200) NOT NULL DEFAULT '',
  `ActiveDate` varchar(25) NOT NULL,
  `ExpireDate` varchar(25) DEFAULT NULL,
  `Job` varchar(200) NOT NULL DEFAULT '',
  `Position` varchar(200) NOT NULL DEFAULT ''
)

そしていくつかのモックデータ:

Id       |`Name`        |ActiveDate              |ExpireDate             |Job       |`Position`
---------------------------------------------------------------------------------------------------
J1234    |Doe, John     |2010-08-15 00:00:00     |2011-08-15 00:00:00    |Worker    |Janitor
J1234    |Doe, John     |2011-08-15 00:00:00     |0000-00-00 00:00:00    |Worker    |Janitor
777      |Doe, Jane     |2010-06-04 00:00:00     |0000-00-00 00:00:00    |Boss      |Janitor
777      |Doe, Jane     |2011-04-30 00:00:00     |0000-00-00 00:00:00    |Boss      |Janitor
654G     |Smith, Jane   |2011-01-20 00:00:00     |0000-00-00 00:00:00    |Worker    |Janitor

テーブルには、実際にはエンド ユーザーが設定する ExpireDate 列もあり、常に設定されているとは限りません。現在、ダミーテーブルを使用して、個別のレコードを取り出してその日に保存しています。私は一時テーブルを使用しますが、MySQL での使用方法を 100% 確信しているわけではなく、嫌いです。私がやっている方法は、より良い SQL を期待して一時的なものです。

次に、完成品を得るために、データを他の多数のテーブルと結合する必要があります。しかし、まだ個別のデータの初期セットを処理する必要があります。そして、最初から他のテーブルに参加してもうまくいきません。

したがって、データをプルして保存し、後で再度プルして他のテーブルに結合する方法は次のとおりです。

INSERT INTO tmp_Person (Id, `Name`, Job, `Position`) 
    SELECT DISTINCT Id, `Name`, Job, `Position`
    FROM Person 

SELECT  tmp_Person.Id, 
    tmp_Person.`Name`, 
    tmp_Person.Job, 
    tmp_Person.`Position`,
    Pricing.Cost, 
    Pricing.Benefit

    FROM tmp_Person
    LEFT OUTER JOIN Pricing AS CL ON CL.PersonId = tmp_Person.Id 
        AND CL.PriceScredule = 'Major-Client' 
        AND CL.ExpireDate = '0000-00-00 00:00:00'
    LEFT OUTER JOIN Pricing AS Inter ON Inter.PersonId = tmp_Person.Id 
        AND Inter.PriceScredule = 'Internal-Client' 
        AND Inter.ExpireDate = '0000-00-00 00:00:00'

一時テーブル (任意の形式) を使用して重複する行を処理するコストを回避するために、これをどのように記述できますか? うまくいけば、私はこれを十分に明確にしました.そうでない場合は、喜んで追加または明確にすることができます.

4

2 に答える 2

3

一時テーブルのコードに置き換えtmp_Personます。

SELECT  tmp_Person.Id, 
    tmp_Person.`Name`, 
    tmp_Person.Job, 
    tmp_Person.`Position`,
    CL.Cost     AS MajorCost,              
    CL.Benefit  AS MajorBenefit,   
    Inter.Cost    AS InternalCost,
    Inter.Benefit AS InternalBenefit

    FROM 
      ( SELECT DISTINCT Id, `Name`, Job, `Position`
        FROM Person 
      )
      AS tmp_Person
    LEFT OUTER JOIN Pricing AS CL ON CL.PersonId = tmp_Person.Id 
        AND CL.PriceScredule = 'Major-Client' 
        AND CL.ExpireDate = '0000-00-00 00:00:00'
    LEFT OUTER JOIN Pricing AS Inter ON Inter.PersonId = tmp_Person.Id 
        AND Inter.PriceScredule = 'Internal-Client' 
        AND Inter.ExpireDate = '0000-00-00 00:00:00'

@Andriy が発見したように、 SELECT リストでPricing.Costorを使用するとエラーが発生します。Pricing.Benefit投稿時に変更するのを忘れていたと思います。

于 2011-08-15T21:35:44.377 に答える
-1

質問が mysql に対するものであることに気付く前にこれをまとめますが、プリンシパルは同じである必要があります。これにより、Person テーブルから最新の ActiveDate を持つ各 PersonID のレコードが取得されます。

select *
from
(
 select persons.*, ROW_NUMBER() over(partition by personid order by personid, activedate desc) as rn 
 from persons
) basedata
where basedata.rn=1
于 2011-08-15T21:43:57.053 に答える