私はすべてのIDの日付範囲にわたって合計を計算しようとしています。私はこれを行うためのSQL構文について、ここではどこからでも見てきましたが、これはかなり一般的な問題であるはずですが、私はというものを見つけませんでした。正確にはです。例えばthisです。MySQLを使用してデータをいくつかの範囲で効率的に要約します。R
私は次の形式を持つテーブルがある:
ID | start_date | end_date
---|---|---
aaa|2016-10-26 07:00| 2016-12-15 04:00
aaa|2016-10-26 08:00| 2016-12-15 05:00
bbb|2016-10-26 07:00| 2016-11-15 03:00
ccc|2016-10-26 07:00| 2016-10-30 04:00
この表はID
とstart_date
PKとして持っていると言えます。 (このテーブルには〜1.5Mのレコードがあります)。このテーブルのすべての行を「ピリオド」と呼ぶことができます。
私はまた、次のようなテーブル内のすべての「作業のタイムスロット」をマークし、カレンダーいる:最後に、私は、消費データを持つテーブルがある
|end_date|
|-|
|2016-10-26 07:00|
|2016-10-26 08:00|
|2016-10-26 09:00|
|...|
|2016-12-26 09:00|
(この表は、〜800件のレコードを持っている) を以下のようになります。 (このテーブルには〜2.3Mレコードがあります)。私は、結果として取得したい何
|ID|start_date|consumption|
|-|-|-|
|aaa|2016-10-27 07:00| 1|
|aaa|2016-10-27 08:00| 5|
|aaa|2016-10-27 09:00| 3|
|bbb|2016-10-27 07:00| 3|
は次の表です:
|ID|start_date|end_date|consumption_sum|
|-|-|-|-|
|aaa|2016-10-26 07:00| 2016-12-15 04:00|14|
|bbb|2016-10-26 07:00| 2016-11-15 03:00|32|
|ccc|2016-10-26 07:00| 2016-10-30 04:00|17|
consumption_sum = SUM(START_DATEとEND_DATEの間営業日のすべての消費データの各IDのための消費)。つまり、各IDの各期間内の消費量の合計が必要です。
今、私は最初の2つのテーブルの間で何らかの種類の結合を行って、すべての「期間」の毎日の展開された行で大きな(大きすぎる)テーブルを取得します。
|ID|start_date|end_date_s|
|-|-|-|
|aaa|2016-10-26 07:00| 2016-10-26 07:00|
|aaa|2016-10-26 07:00| 2016-10-26 08:00|
|aaa|2016-10-26 07:00| 2016-10-26 09:00|
|aaa|2016-10-26 07:00| 2016-10-26 10:00|
|aaa|2016-10-26 07:00| ...|
|aaa|2016-10-26 07:00| 2016-12-15 04:00|
|bbb|2016-10-26 07:00| 2016-10-26 07:00|
|bbb|2016-10-26 07:00| 2016-10-26 08:00|
|bbb|2016-10-26 07:00| 2016-10-26 09:00|
|bbb|2016-10-26 07:00| ...|
|bbb|2016-10-26 07:00| 2016-11-15 03:00|
|ccc|2016-10-26 07:00| 2016-10-26 07:00|
|ccc|2016-10-26 07:00| ...|
、その後、毎日end_date_s
の消費量を取得するために三番目に、このテーブルに参加:次のように。
最後に、(ID、開始日)を合計して目的のテーブルを取得します。
私は今までに見つけた最高のfoverlaps
という名前のdata.table関数を使ってRでこれをやっています。これは正しく動作します。
悲しいことに、データのサイズによって、最初の2つのテーブルを結合するときに自分のPCがメモリ不足になります。
R(またはMySQL経由で、私は気にしません)がうまくいくかどうか、私は疑問に思っていました。
私は現在使用しているRコードは以下の通り(例データが間違っているが、少なくとも、あなたは、コードを見ることができます):これは確かに答えた場合には、事前(と気の毒に
library(data.table)
library(magrittr)
stocks_periodo <-
structure(list(CODIGO_REFERENCIA = c("5293cb5478d6d400f0f555d531f2d63b",
"0fe0b44806573de5bde3c200455f5f03", "eb57daacff2abadf0f4551386f3c6678",
"2ead409e514f379fec7c94504f79206b", "cd0f1f709ed6631aeaf00881fc43ccad"
), PERIODO_INI = structure(c(1477512000, 1477512000, 1477512000,
1477512000, 1477512000), class = c("POSIXct", "POSIXt"), tzone = "Europe/Paris"),
PERIODO_FIN = structure(c(1477533600, 1477533600, 1477533600,
1477533600, 1477533600), class = c("POSIXct", "POSIXt"), tzone = "Europe/Paris")), class = "data.frame", .Names = c("CODIGO_REFERENCIA",
"PERIODO_INI", "PERIODO_FIN"), row.names = c(NA, -5L)) %>% data.table(key="PERIODO_INI,PERIODO_FIN")
calendario_n <-
structure(list(PERIODO_INI = structure(c(1477512000, 1477515600,
1477519200, 1477522800, 1477526400), class = c("POSIXct", "POSIXt"
), tzone = "Europe/Paris"), PERIODO_FIN = structure(c(1477512000,
1477515600, 1477519200, 1477522800, 1477526400), class = c("POSIXct",
"POSIXt"), tzone = "Europe/Paris")), .Names = c("PERIODO_INI",
"PERIODO_FIN"), row.names = c(NA, 5L), class = "data.frame") %>% data.table(key="PERIODO_INI,PERIODO_FIN")
consumos <-
structure(list(PERIODO = structure(c(1478034000, 1478037600,
1478041200, 1478044800, 1478048400), class = c("POSIXct", "POSIXt"
), tzone = ""), CODIGO_REFERENCIA = c("f3bcfd70cc0c3434d96278c0cfee1df4",
"f3bcfd70cc0c3434d96278c0cfee1df4", "f3bcfd70cc0c3434d96278c0cfee1df4",
"f3bcfd70cc0c3434d96278c0cfee1df4", "f3bcfd70cc0c3434d96278c0cfee1df4"
), DIARIO_CONSUMOS = c(8L, 8L, 8L, 8L, 8L)), class = "data.frame", .Names = c("PERIODO",
"CODIGO_REFERENCIA", "DIARIO_CONSUMOS"), row.names = c(NA, -5L
)) %>% data.table(key="CODIGO_REFERENCIA,PERIODO")
consumos_futuros<-
foverlaps(calendario_n, stocks_periodo, nomatch=0L) %>%
select(-i.PERIODO_INI, -PERIODO_FIN) %>%
rename(PERIODO_FIN= i.PERIODO_FIN) %>%
data.table(key="CODIGO_REFERENCIA,PERIODO_INI,PERIODO_FIN")
stocks_periodo %<>%
data.table(key=c("CODIGO_REFERENCIA", "PERIODO_INI", "PERIODO_FIN"))
consumos_futuros <- consumos_futuros[!stocks_periodo]
consumos_futuros %<>%
rename(PERIODO= PERIODO_FIN) %>%
data.table(key="CODIGO_REFERENCIA,PERIODO") %>%
merge(consumos) %>%
group_by(CODIGO_REFERENCIA, PERIODO_INI) %>%
summarize(CONSUMO_TOTAL= sum(DIARIO_CONSUMOS)) %>%
data.table
感謝をどこか別の場所)。
@JasonAizkalnsありがとう、ちょうど私はそれを理解しました。 OPはmagrittrではなくdplyrを指定しており、彼の質問を編集してライブラリステートメントを含める必要があります。 –
[this post](http://stackoverflow.com/q/24480031/2572423)を読んでいますか? – JasonAizkalns
@JasonAizkalnsありがとうございます。はい:私はその投稿にも到達したと思います。私はそこに記述したのと同じ機能を使っていると思う。私はそれ(またはメモリがなくても同じ機能を使用する方法)への代替方法を探しています。 – pchtsp