4

SQL Serverには、次のデータがあり、毎週最新の行を取得したいと考えています。

次の表があります。(WW日付の週番号)列は存在せず、日付だけです。クエリの目的をわかりやすく説明するために、この列を配置しました。

Number  Date          WW
392     2012-07-23    30
439     2012-07-24    30
735     2012-07-25    30
882     2012-07-26    30 *
193     2012-07-30    31
412     2012-07-31    31   
425     2012-08-01    31
748     2012-08-02    31
711     2012-08-03    31 *
757     2012-08-07    32
113     2012-08-08    32 *
444     2012-08-15    33 *

クエリの望ましい結果は次のようになります

882     30 
711     31 
113     32 
444     33 

基本的に私が取得したいのは毎週の最新の行です。このような例を見つけました。SQLサーバーで先月のレコードを取得し て最新のレコードを検索しますが、毎週の結果のリストを取得するためにそれらを拡張する方法がわかりません。行は任意の日付で保存できます。たとえば、1週間で結果がない場合や、1週間で5行、次の週で10行になる場合があります。私はこれについていくつかのヒントを本当にいただければ幸いです。

4

3 に答える 3

7

次のようなものを使用できるはずです。

select t1.number, t2.ww
from yourtable t1
inner join
(
    select max(date) mxdate, datepart(week, [Date]) ww
    from yourtable 
    group by datepart(week, [Date])
) t2
    on t1.date = t2.mxdate
    and datepart(week, t1.[Date]) = t2.ww;

または、次を使用できますCTE

;with cte as
(
  select number, datepart(week, [Date]) ww,
    row_number() over(partition by datepart(week, [Date]) 
                      order by date desc) rn
  from yourtable
)
select number, ww
from cte
where rn = 1

SQL FiddlewithDemoを参照してください

MAX()このバージョンを使用していて、同じ日付の2つの番号がある場合は、2つのレコードが返されます。バージョンを使用するrow_number()と、row_numberフィルターが適用されるため、基準を満たす1つのレコードのみが返されます(デモを参照) 。

于 2012-10-02T14:57:44.473 に答える
3

SQLサーバーを使用している場合、これを行うことができます:

declare @test table(Number int, Date datetime, WW int);

INSERT INTO @test
    (Number, Date, WW)
VALUES
    (392, '2012-07-22 17:00:00', 30),
    (439, '2012-07-23 17:00:00', 30),
    (735, '2012-07-24 17:00:00', 30),
    (882, '2012-07-25 17:00:00', 30),
    (193, '2012-07-29 17:00:00', 31),
    (412, '2012-07-30 17:00:00', 31),
    (425, '2012-07-31 17:00:00', 31),
    (748, '2012-08-01 17:00:00', 31),
    (711, '2012-08-05 17:00:00', 31),
    (757, '2012-08-06 17:00:00', 32),
    (113, '2012-08-07 17:00:00', 32),
    (444, '2012-08-14 17:00:00', 33)

SELECT * FROM (
select number, date, ww,
row_number() over (partition by ww order by date desc) rn
from @test) v
WHERE rn = 1;
于 2012-10-02T15:03:22.140 に答える
1

これは、以下に示すように、相関サブクエリを使用して実行できます。

SELECT number, [date]
FROM tablename T
WHERE NOT EXISTS (
    SELECT 1
    FROM tablename
    WHERE DATEPART(wk, [date]) = DATEPART(wk, T.[date])
        AND date > T.[date]
)

これは 2012-08-06 を返さないことに注意してください。これは、実際にはその年の 32 週目にあると思われるためです

于 2012-10-02T15:16:28.833 に答える