minDate <- "2014-01-01" dateCol <- c("activityperiodid") DT.label_ranks <- makeQry(tbl="fact_sales", schema="production", colsToAgg="gross", colsToPull=c("activityperiodid", "labelid", "storeid"), dateCol=dateCol, minDate=minDate, limit=NULL) %>% runQry(cluster=7) addDateCols.periodid_(DT.label_ranks) DT.label_ranks <- DT.label_ranks[activitydate >= minDate] DT.label_ranks[, yr := year(activitydate)] DT.label_ranks[, activityperiodid := NULL] DT.label_ranks.spot <- aggregateDT(DT.label_ranks[storeid == 286], exclude="activitydate", colsToAgg="gross") DT.label_ranks.spot[, ranking := rank(-gross, na.last=TRUE, ties="min"), by=list(storeid, yr)] reshape2::dcast(DT.label_ranks.spot[ranking <= 25], labelid ~ yr, value.var=c("gross", "ranking")) DT.label_ranks.spot[, storeid := NULL] DT.label_ranks.spot[ranking <= 25][, sapply(yr, paste0, c("_gross", "_ranking")) %>% setNames(obj=data.table(gross[[1]], ranking[[2]], gross[[2]], ranking[[2]])), by=labelid] DT.label_ranks.spot[ranking <= 25 & yr == 2014][order(ranking, decreasing=TRUE)] &&& LEFT OFF HERE ... zipper combine gross and ranking zipperCombine DT.label_ranks.spot[]