4 ms·
A more functional mindset can definitely help here. Think of your "sales per day" model in terms of starting with a sequence of days--startingDay up to startin
by sk5t 7y ago
A more functional mindset can definitely help here. Think of your "sales per day" model in terms of starting with a sequence of days--startingDay up to startingDay + n--as the input to a function that maps to an aggregate of that day's activity.
Aggregate functions in SQL are IMHO quite awesome once you develop a comfort level to stop worrying about them per se. I wouldn't like to try to get Excel to tell me--or write the code to do manually--something like "show me the standard deviation in units sold by day of week over the last ten summers."
- pbowyer 7y agoI find thinking about analytic queries like these as map/filter/reduce easier than thinking in terms of the SQL!
- taffer 7y agoSQL and functional programming constructs are actually quite similar: SELECT -> map FROM -> stream JOIN -> flatMap WHERE -> filter GROUP BY -> collect ORDER BY -> sorted https://blog.jooq.org/2015/08/13/common-sql-clauses-and-their-equivalents-in-java-8-streams/ https://blog.jooq.org/2015/08/13/common-sql-clauses-and-thei...
- karmakaze 7y agoI don't see how JOIN is like flatMap. It's a subset of a cross-product. It's more like do-notation: x <- .. y <- .. return (x, y)
- taffer 7y ago> I don't see how JOIN is like flatMap This is explained in the blog post I linked, including an example.
- karmakaze 7y agoIt's really flatMap/map from the link: List<Integer> s1 = Stream.of(1, 2); Supplier<Stream<String>> s2 = ()->Stream.of("A", "B"); s1.flatMap(v1 -> s2.get() .map(v2 -> tuple(v1, v2))) .forEach(System.out::println); That's just a nested loop.