0

私はテーブルを持っていますPromoDescription

--------------------------------------------------
| PromoId | Value | PromoType  |NightType|
--------------------------------------------------
|   101   |   11  |      a     |     b   |       
|   102   |   12  |      a     |     b   |       
|   103   |   17  |      c     |     d   |       
|   104   |   14  |      c     |     d   |       

上記の表には4つの列があり、サンプル値を追加しました。

問題:PromotionTypeと の同じ組み合わせに対してNightType、割引の最大値を維持し、残りの行を削除する必要があります。

サンプル値については、行1と4を削除する必要があります。

4

4 に答える 4

1

CTE を使用してこれを実行できます。

;with cte as
(
  select promoid, value, promotype, NightType,
    row_number() over(partition by promotype, NightType order by value desc) rn
  from yourtable
)
delete
from cte
where rn > 1;

デモで SQL Fiddle を参照してください

これにより、最大値を持たないものはすべてテーブルから削除されます。

| PROMOID | VALUE | PROMOTYPE | NIGHTTYPE |
-------------------------------------------
|     102 |    12 |         a |         b |
|     103 |    17 |         c |         d |
于 2013-01-10T11:02:29.510 に答える
1

チェックしてください:

with c as
(
    select *, row_number() over(partition by PromotionType, NightType order by [Value] desc) as n
    from PromoDescription
)
delete from c
where n > 1;
于 2013-01-10T11:02:49.427 に答える
0

次のように join を使用することもできます。

DELETE table1 
  FROM table1
  LEFT JOIN 
  (SELECT MAX(Value) as MaxValue, Promotype, nighttype FROM table1
   GROUP BY Promotype, nighttype
  )A
  ON table1.value = A.MaxValue
  AND table1.Promotype = A.Promotype
  AND table1.nighttype = A.nighttype
  WHERE A.MaxValue IS NULL;

このSQLFiddleを参照してください

結果

| PROMOID | VALUE | PROMOTYPE | NIGHTTYPE |
-------------------------------------------
|     102 |    12 |         a |         b |
|     103 |    17 |         c |         d |
于 2013-01-10T11:05:10.897 に答える
0

私は使用するのが好きNOT EXISTSですが、これは一般的なテーマの単なるバリエーションです:

select *
from yourtable a
where not exists
  (
  select 1
  from yourtable b
  where 
      a.PromoType = b.PromoType and
      a.NightType = b.NightType and
      a.Value < b.Value

  )

SQLフィドルはこちら

于 2013-01-10T11:24:46.250 に答える