私はここで、テーブルを持っていますポイントを見てリワードフィールド。報酬ポイント、既に作成されたフィールドを見て、
すでに最初のテーブルが作成されています.2つの新しいフィールド、つまり金と銀のフィールドを持つ新しいテーブルが必要です。
私は出力がこのような何かになりたい:クエリで私を助けたり、私に続行する方法についていくつかの提案を教えてください
。
ありがとうございます。
私はここで、テーブルを持っていますポイントを見てリワードフィールド。報酬ポイント、既に作成されたフィールドを見て、
すでに最初のテーブルが作成されています.2つの新しいフィールド、つまり金と銀のフィールドを持つ新しいテーブルが必要です。
私は出力がこのような何かになりたい:クエリで私を助けたり、私に続行する方法についていくつかの提案を教えてください
。
ありがとうございます。
は、私はあなたがこのためにdense_rank()
を使用したいと思う:
select t.*,
(case when rnk = 1 then 1 else 0 end) as gold,
(case when rnk = 2 then 1 else 0 end) as silver
from (select t.*,
dense_rank() over (partition by week order by pointsrewarded) as rnk
from t
) t;
dense_rank()
が結びつきがある場合を処理します。その場合、複数の「金」と「銀」の値が割り当てられます。
サブクエリは必要ありません。外部クエリでdense_rank()
を繰り返すことができます。私はちょうどこの方法でロジックを実行する方が簡単だと思います。
ポイント還元された降順で注文するようにしてください。最初の場所は最高点であり、最も低い点ではありません。私のコードは長いですが、私は読むのがより簡単です(個人的な好み)。
--create table employee (employeeid int, employeename varchar(50), weeknumber int, pointsRewarded int, Hours int)
--insert into employee values (111, 'person1', 1, 400, 2)
--insert into employee values (112, 'person2', 1, 100, 10)
--insert into employee values (113, 'person3', 1, 200, 10)
--insert into employee values (111, 'person1', 2, 100, 2)
--insert into employee values (112, 'person2', 2, 50, 10)
--insert into employee values (113, 'person3', 2, 200, 10)
--insert into employee values (111, 'person1', 3, 20, 4)
--insert into employee values (112, 'person2', 3, 25, 5)
--insert into employee values (113, 'person3', 3, 100, 6)
;WITH Medals AS
(
SELECT
employeeid
,employeename
,weeknumber
,pointsRewarded
,hours
,ROW_NUMBER() OVER (PARTITION BY weeknumber ORDER BY pointsrewarded DESC) medal
FROM
employee
)
SELECT
employeeid
,employeename
,weeknumber
,pointsRewarded
,hours
,CASE WHEN medal = 1 THEN 1 ELSE 0 END AS gold
,CASE WHEN medal = 2 THEN 1 ELSE 0 END AS silver
FROM
Medals
と似ています。 –
真の天才です!! –
元のテーブルにハードコードされたrnk、gold、およびsilverフィールドを作成するにはどうすればいいですか?つまり、クエリの結果が最初のテーブル.Plzは –