パーティションの概念は初めてです。私は水平分割を知っていますが、分割日付を行うことはできますか? 私のプロジェクトでは、新年に入るたびにパーティションを作成する必要があります。誰でもこれを行う方法を説明できますか? 私はERP swに取り組んでおり、過去1年間のデータがあり、年ごとにパーティションが必要です.(たとえば、2011年4月から2012年3月までは1年です)
2 に答える
あなたがパーティショニングと言うとき、それがウィンドウ化された関数を意味するのか、それとも単にデータをグループ化することを意味するのか、私は興味があります. データをパーティション分割して集計する 2 つの方法を自己実証例で示します。
declare @Orders table( id int identity, dt date, counts int)
insert into @Orders values ('1-1-12', 2),('1-1-12', 3),('1-18-12', 1),('2-11-12', 5),('3-1-12', 2),('6-1-12', 8),('10-1-12', 2),('1-13-13', 8)
-- To do days I need to do a group by
select
dt as DayDate
, SUM(counts) as sums
from @Orders
group by dt
-- To do months I need to group differently
select
DATEADD(month, datediff(month, 0, dt), 0) as MonthDate
-- above is a grouping trick basically stating count from 1/1/1900 the number of months of difference from my date field.
--This will always yield the current first day of the month of a date field
, SUM(counts) as sums
from @Orders
group by DATEADD(month, datediff(month, 0, dt), 0)
-- well that is great but what if I want to group different ways all at once?
-- why windowed functions rock:
select
dt
, counts
, SUM(counts) over(partition by DATEADD(year, datediff(year, 0, dt), 0)) as YearPartitioning
, SUM(counts) over(partition by DATEADD(month, datediff(month, 0, dt), 0)) as MonthPartitioning
-- expression above will work for year, month, day, minute, etc. You just need to add it to both the dateadd and datediff functions
, SUM(counts) over(partition by dt) as DayPartitioning
from @Orders
グループ化に関する重要な概念は、従来の group by 句であり、数学演算を実行していないものを作業対象のピボットとしてリストする必要があります。したがって、最初の選択では、日付を選択してから合計(カウント)と言いました。次に、1-1-12 に 2 つの値があることを確認したため、それらの両方を追加し、他のすべてのものにそれらを個別に追加しました。2 番目の select メソッドでは、日付フィールドを月の最初の日に変換するトリックを実行します。これは素晴らしいことですが、一度にすべてが欲しいかもしれません。
ウィンドウ化された関数はグループ化をインラインで行います。つまり、over() 部分が行っていることなので、グループ化句は必要ありません。ただし、データセットを制限していないため、値が繰り返される場合があります。これは、3 番目に選択した 'YearPartitioning' の 3 番目の列を見ると、23 という数字が 7 回繰り返されていることを意味します。なぜ?関数の外側でグループ化を行うようにステートメントに指示したことがないため、すべての行が表示されます。年がすべての値で同じであるという式が true である限り、数値 23 が発生します。ウィンドウ式から選択するときは、このことを覚えておいてください。
あなたが探しているのは次のようなものだと思います:
DECLARE @referenceDate datetime = '3/1/2011'
SELECT
[sub].[Period] + 1 AS [PeriodNr],
YEAR(DATEADD(YEAR, [sub].[Period], @referenceDate)) AS [PeriodStartedIn],
COUNT(*) AS [NumberOfRecords],
SUM([sub].[Value]) AS [TotalValue]
FROM
(
SELECT
*,
FLOOR(DATEDIFF(MONTH, @referenceDate, [timestamp]) / 12.0) AS [Period]
FROM [erp]
WHERE [timestamp] >= @referenceDate
) AS [sub]
GROUP BY [sub].[Period]
ORDER BY [sub].[Period] ASC