1

もう一度、あなたの専門知識が本当に必要です。ここではうまくランク付けされていないようです... 返された 2 つのレコードがあり、日時がわずかに異なっていても両方とも 1 位にランクされています。ありがとうございます。いつもありがとうございます。

                SELECT  CD.MEMACT,
                     CD.DATETIME,--DATETIME
                     CD.AG_ID,
                     RANK() OVER (PARTITION BY 
                                       CD.MEMACT,
                                       CD.DATETIME,
                                       CD.AG_ID
                                ORDER BY CD.DATETIME)RANKED

                 FROM MEM_ACT_TBL
                 WHERE CD.MEMACT='1024518'
4

2 に答える 2

2

データを見なくても、パーティション分割方法が原因であると言えます。「パーティショニング」ステートメントは、基本的に、番号位置のリセットを決定するためにグループ化するものです。'order by' は、そのデータをどのように並べるかの順序を決定します。この単純な例を参照してください。私の最初のウィンドウ関数で、あまりにも多くの partition by を使用しているため、冗長なものがたくさん表示されています。

簡単な自己抽出の例:

declare @Person Table ( personID int identity, person varchar(8));

insert into @Person values ('Brett'),('Sean'),('Chad'),('Michael'),('Ray'),('Erik'),('Queyn');

declare @Orders table ( OrderID int identity, PersonID int, Desciption varchar(32), Amount int);

insert into @Orders values (1, 'Shirt', 20),(1, 'Shoes', 50),(2, 'Shirt', 22),(2, 'Shoes', 52),(3, 'Shirt', 20),(3, 'Shoes', 50),(3, 'Hat', 20),(4, 'Shirt', 20),(5, 'Shirt', 20),(5, 'Pants', 30),
(6, 'Shirt', 20),(6, 'RunningShoes', 70),(7, 'Shirt', 22),(7, 'Shoes', 40),(7, 'Coat', 80)

Select
    p.person
,   o.Desciption
,   o.Amount
,   row_number() over(partition by person, Desciption order by Desciption) as [Wrong I Used Too Many Partitions]
,   row_number() over(partition by person order by Desciption) as [Correct By Alpha of Description]
,   row_number() over(partition by person order by Amount desc) as [Correct By Amount of Highest First]
from @Person p
    join @Orders o on p.personID = o.PersonID

代わりにこれを行うことができると思います:

SELECT  
   CD.MEMACT,
   CD.DATETIME,--DATETIME
   CD.AG_ID,
   RANK() OVER (PARTITION BY CD.MEMACT ORDER BY CD.DATETIME, CD.AG_ID) RANKED
   FROM MEM_ACT_TBL
   WHERE CD.MEMACT='1024518'
于 2013-03-21T22:31:47.047 に答える
2

このサンプル データは、期待に反するものとして提供されました。

MEMACT   DATETIME         AG_ID    RANK
-------  ---------------  -------  ----
1024518  12/26/2013 7:43  Ag_1541  1
1024518  12/26/2013 7:53  Ag_2488  1

しかし、あなたのコード例では、PARTITION BY CD.MEMACT, CD.DATETIME, CD.AG_ID. これは、これらの値を共有しないすべての行を完全に別のランキング シリーズとして扱うことを明示的に意味します。MEMACT上記の 2 つの行は、DATETIME、および値が同じではないため、AG_IDそれぞれのランキングは 1 から始まります。

上記の 2 つの行のランクが上がると予想していた場合は、MEMACT行間でその列だけが同じであるため、 以外で分割してはなりません。DATETIME次に、次のように並べ替える可能性が最も高くなりAG_IDます (同じ日付の行が 2 つある場合に決定論を取得するため)。

PARTITION BY CD.MEMACT ORDER BY CD.DATETIME, CD.AG_ID

同じ列ですべての個別のシリーズを既に分離しているため、これにより、作業する異なるデータがないことが保証されるため、両方PARTITION BY ランキング関数では意味がありません。ORDER BYORDER BY

于 2013-03-21T22:47:26.573 に答える