bugfix> sql > 投稿

2つの列として週番号と年を含むテーブルがあります。週番号は各年で0から52になりますが、現在の問題は、現在の更新値に基づいて以前の更新を週番号と年として見つけなければならないことです。更新。 2017年の52週目または2018年の15週目である可能性があります。

私はこれを試しました:

SELECT TOP(1) WEEKNUM AS WEEK,YEARNUM AS YEAR 
FROM UPDATE_TABLE
WHERE (WEEKNUM < 22 and YEARNUM = 2019) or (YEARNUM < 2019 ) 
ORDER BY WEEKNUM DESC,YEARNUM DESC

2018年未満が選択されているため、OR部分で失敗します。

こちらが表です ┌─────────┬─────────┐ │ weeknum │ yearnum │ ├─────────┼─────────┤ │ 28 │ 2018 │ │ 19 │ 2018 │ │ 17 │ 2018 │ │ 21 │ 2018 │ │ 21 │ 2017 │ │ 30 │ 2017 │ │ 31 │ 2017 │ │ 48 │ 2017 │ │ 49 │ 2017 │ │ 50 │ 2017 │ │ 51 │ 2017 │ │ 22 │ 2019 │ └─────────┴─────────┘

上記のクエリはこの結果を返します

WEEK YEAR 51 2017

私が期待しているのは

WEEK YEAR 28 2018

これはシステムの最後の更新です。同様に、2018年17月を現在の更新として検討する場合、51 2017年を出力として取得する必要があります。

ヒント:週番号は現在の更新週よりも小さいか、または大きい可能性があり、年は現在の年または現在の更新年の前の年である可能性があります。

回答 2 件
  • あなたはただあなたの ORDER BY を得た  句がまちまち。最初に年で、次に週で注文します。

    SELECT TOP(1) WEEKNUM AS WEEK, YEARNUM AS YEAR 
    FROM UPDATE_TABLE
    WHERE (WEEKNUM < 22 and YEARNUM = 2019) or (YEARNUM < 2019 ) 
    ORDER BY YEARNUM DESC, WEEKNUM DESC;
    
    

    これにより、2019W22の前の最後の更新週になります。

  • ORDER   WEEKNUM + (YEARNUM * 52) でフィルタリング  何らかの種類の AND/OR を適用しようとする代わりに、単一の派生列として  論理。

    ROW_NUMBER() も使用できます  基数列を作成して、前の行を簡単に取得できるようにします。または、 LAG() の使用を検討することもできます  関数。

あなたの答え