1

こんにちは、私は SQL の初心者ですので、ご容赦ください.. :)

私の質問は次のとおりです。

私はこのテーブルを手に入れました:

     DateTime         ID     Year    Month   Value    Cost
-------------------|------|--------|-------|-------|--------|
 1-1-2013 00:00:01 |  1   |  2013  |   1   |  30   |   90   |
 1-1-2013 00:01:01 |  1   |  2013  |   1   |  0    |   0    |
 1-1-2013 00:02:01 |  1   |  2013  |   1   |  1    |   3    |
 1-2-2013 00:00:01 |  1   |  2013  |   2   |  2    |   6    |
 1-2-2013 00:01:01 |  1   |  2013  |   2   |  3    |   9    |
 1-2-2013 00:02:01 |  1   |  2013  |   2   |  4    |   12   |
 1-3-2013 00:00:01 |  1   |  2013  |   3   |  5    |   15   |
 1-3-2013 00:01:01 |  1   |  2013  |   3   |  6    |   18   |
 1-3-2013 00:02:01 |  1   |  2013  |   3   |  7    |   21   |

今私が得ようとしているのはこの結果です

   Year    Month   Value    Cost
|--------|-------|-------|--------|
|  2013  |   1   |  1    |   3    |
|  2013  |   2   |  4    |   12   |
|  2013  |   3   |  7    |   21   |

ご覧のとおり、[月] と [年] でグループ化し、[月] ごとに最後の [値] を取得しようとしています。

結果からわかるように、[Value] 列から MAX() 値を取得しようとはしませんが、すべての [Month] の最後の値を取得しようとします。それが私の問題です..

前もって感謝します

PS
[Year] と [Month] を GROUP BY できましたが、[Value] 列を追加すると、GROUP BY は結果に影響を与えないことを理解しています。取得する SQL..

4

2 に答える 2

1

を使用する代わりに、を使用row_number()することもできますrank()。を使用rank()すると、同じ年と月に複数の値が表示される場合があります。この投稿を参照してください。このため、groupbyが追加されます。

SELECT
  [Year],
  [Month],
  [Value],
  [Cost]
FROM
(
  SELECT 
    [Year],
    [Month],
    [Value],
    [Cost],
    Rank() OVER (PARTITION BY [Year], [Month] ORDER BY [DateTime] DESC) AS [Rank]
  FROM [t1]
) AS [sub]
WHERE [Rank] = 1
GROUP BY 
  [Year],
  [Month],
  [Value],
  [Cost]
ORDER BY
  [Year] ASC,
  [Month] ASC

コメントで述べられているように、これでも1か月に複数のレコードが返される可能性があります。そのため、必要な機能に基づいて、ORDERBYステートメントを拡張できます。

Rank() OVER (PARTITION BY [Year], [Month] ORDER BY [DateTime] DESC, [Value] DESC, [Cost] ASC) AS [Rank]

[Value]および[Cost]またはASC<>の順序を切り替えるDESCと、ランクに影響し、そのため結果に影響します。

于 2013-01-08T11:38:07.750 に答える
0

SQL Server 2008 を使用row_number()しているため、結果を取得するために使用できます。

select year, month, value, cost
from
(
  select year, month, value, cost,
    row_number() over(partition by year, month order by datetime desc) rn
  from yourtable
) src
where rn = 1

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

または、サブクエリを使用してこれを取得することもできます (注:このバージョンでは、1 か月あたりの最大値が同じレコードが複数ある場合、datetime各レコードが返されます。

select t1.year, t1.month, t1.value, t1.cost
from yourtable t1
inner join
(
  select max(datetime) datetime
  from yourtable
  group by year, month
) t2
  on t1.datetime = t2.datetime

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

どちらも同じ結果になります。

| YEAR | MONTH | VALUE | COST |
-------------------------------
| 2013 |     1 |     1 |    3 |
| 2013 |     2 |     4 |   12 |
| 2013 |     3 |     7 |   21 |
于 2013-01-08T11:23:40.107 に答える