diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+v 0.4.0.0 
+* Added ```splitOnData``` for assigning via a given set of data cols.
+* Bumped upper bounds
+* Checked compilation w/ghc-8.10.2
+* Fixed a redundant include warning for Monoid using CPP in Frames.Folds
+
 v 0.3.0.0
 * Added Combinator for aggregation in Frames.Aggregation along with helpers to create folds over data cols, promote simple functions to
 record functions to be used in aggregations, combine key aggregations.
diff --git a/Frames-map-reduce.cabal b/Frames-map-reduce.cabal
--- a/Frames-map-reduce.cabal
+++ b/Frames-map-reduce.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.2
 
 name:                Frames-map-reduce
-version:             0.3.0.0
+version:             0.4.0.0
 synopsis:            Frames wrapper for map-reduce-folds and some extra folds helpers.
 description:         Frames-map-reduce provides some helpers for using the map-reduce-folds library with vinyl records and Frames.
                      These include functions for filtering Frames, splitting records into key columns and data columns and
@@ -17,7 +17,7 @@
 category:            Data
 extra-source-files:  CHANGELOG.md    
 Build-type: Simple
-tested-with: GHC ==8.6.4 || ==8.6.2
+tested-with: GHC ==8.6.5 || ==8.8.3 || ==8.10.2
 
 source-repository head
     Type: git
@@ -35,13 +35,13 @@
                  , Frames.Aggregation.General
                  , Frames.Aggregation.Maybe
 
-  build-depends: Frames               >= 0.6.1 && < 0.7,
-                 base                 >= 4.12.0 && < 4.14,
+  build-depends: Frames               >= 0.6.1 && < 0.8,
+                 base                 >= 4.12.0 && < 4.15,
                  containers           >= 0.5.0 && < 0.7,
                  hashable             >= 1.2.7 && < 1.4,
-                 map-reduce-folds     >= 0.1.0.0 && < 0.1.0.5,                 
+                 map-reduce-folds     >= 0.1.0 && < 0.2,                 
                  profunctors          >= 5.3 && < 5.6,
-                 vinyl                >= 0.11.0 && < 0.13,
+                 vinyl                >= 0.11.0 && < 0.14,
                  foldl                >= 1.4.5 && < 1.5,
                  newtype              >= 0.2 && < 0.3
   hs-source-dirs:      src
@@ -60,5 +60,5 @@
                   text >= 1.2.3 && < 1.3,
                   vector,
                   vinyl,
-                  random >= 1.1 && < 1.2,                  
+                  random >= 1.2 && < 1.3,                  
     default-language:    Haskell2010
diff --git a/src/Frames/Folds.hs b/src/Frames/Folds.hs
--- a/src/Frames/Folds.hs
+++ b/src/Frames/Folds.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE AllowAmbiguousTypes   #-}
 {-# LANGUAGE ConstraintKinds       #-}
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DeriveGeneric         #-}
 {-# LANGUAGE FlexibleContexts      #-}
@@ -46,8 +47,9 @@
   , sequenceRecFold
   , sequenceEndoFolds
 
-  -- * functions using constraints to extend an endo-fold across a record
+  -- * functions/types using constraints to extend an endo-fold across a record
   , foldAll
+  , ConstrainedFoldable
   , foldAllConstrained
   , foldAllMonoid
 
@@ -59,9 +61,11 @@
 
 import qualified Control.Foldl                 as FL
 import qualified Control.Newtype               as N
-import           Data.Monoid                    ( (<>)
-                                                , Monoid(..)
-                                                )
+#if MIN_VERSION_base(4,11,0)
+#else  
+import           Data.Monoid                    ( (<>) )
+import           Data.Monoid                    ( Monoid(..))
+#endif
 import qualified Data.Profunctor               as P
 import qualified Data.Vinyl                    as V
 import qualified Data.Vinyl.TypeLevel          as V
@@ -204,20 +208,23 @@
 class (c (V.Snd t)) => ConstrainedField c t
 instance (c (V.Snd t)) => ConstrainedField c t
 
+type ConstrainedFoldable c rs = (V.RPureConstrained (ConstrainedField c) rs
+                                , V.RPureConstrained V.KnownField rs
+                                , V.RApply rs
+                                , EndoFieldFoldsToRecordFolds rs
+                                )
+
 -- | Apply a constrained endo-fold to all fields of a record.
 -- May require a use of TypeApplications, e.g., foldAllConstrained @Num FL.sum
 foldAllConstrained
-  :: forall c rs
-   . ( V.RPureConstrained (ConstrainedField c) rs
-     , V.RPureConstrained V.KnownField rs
-     , V.RApply rs
-     , EndoFieldFoldsToRecordFolds rs
-     )
+  :: forall c rs. ConstrainedFoldable c rs
   => (forall a . c a => FL.Fold a a)
   -> FL.Fold (F.Record rs) (F.Record rs)
 foldAllConstrained f =
   sequenceEndoFolds $ V.rpureConstrained @(ConstrainedField c) (FoldEndo f)
 {-# INLINABLE foldAllConstrained #-}
+
+
 
 -- | Given a monoid-wrapper, e.g., Sum, and functions to wrap and unwrap, we can produce an endo-fold on a
 monoidWrapperToFold
diff --git a/src/Frames/MapReduce.hs b/src/Frames/MapReduce.hs
--- a/src/Frames/MapReduce.hs
+++ b/src/Frames/MapReduce.hs
@@ -40,6 +40,7 @@
   , assignKeysAndData
   , assignKeys
   , splitOnKeys
+  , splitOnData
 
   -- * Reduce and Re-Attach Key Cols
   , reduceAndAddKey
@@ -59,7 +60,6 @@
 
 import qualified Control.Foldl                 as FL
 import qualified Data.Hashable                 as Hash
-import           Data.Hashable                  ( Hashable )
 
 import qualified Frames                        as F
 import qualified Frames.Melt                   as F
@@ -123,6 +123,14 @@
   => MR.Assign (F.Record ks) (F.Record rs) (F.Record cs)
 splitOnKeys = assignKeysAndData @ks @cs
 {-# INLINABLE splitOnKeys #-}
+
+-- | Assign data and leave the rest of the columns, excluding the data, as the key.
+splitOnData
+  :: forall cs rs ks
+   . (cs F.⊆ rs, ks ~ F.RDeleteAll cs rs, ks F.⊆ rs)
+  => MR.Assign (F.Record ks) (F.Record rs) (F.Record cs)
+splitOnData = assignKeysAndData @ks @cs
+{-# INLINABLE splitOnData #-}
 
 -- | Reduce the data to a single row and then re-attach the key.
 reduceAndAddKey
diff --git a/src/Frames/MapReduce/General.hs b/src/Frames/MapReduce/General.hs
--- a/src/Frames/MapReduce/General.hs
+++ b/src/Frames/MapReduce/General.hs
@@ -180,6 +180,18 @@
 splitOnKeys = assignKeysAndData @ks @cs
 {-# INLINABLE splitOnKeys #-}
 
+-- | Assign data and leave the rest of the columns, excluding the data, as the keys.
+splitOnData
+  :: forall cs rs ks record f
+   . (RCastC ks rs record f, RCastC cs rs record f, ks ~ F.RDeleteAll cs rs)
+  => MR.Assign
+       (record (f :. ElField) ks)
+       (record (f :. ElField) rs)
+       (record (f :. ElField) cs)
+splitOnData = assignKeysAndData @ks @cs
+{-# INLINABLE splitOnData #-}
+
+
 -- | Assign keys and leave all columns, including the keys, in the data passed to reduce.
 assignKeys
   :: forall ks rs record f
diff --git a/src/Frames/MapReduce/Maybe.hs b/src/Frames/MapReduce/Maybe.hs
--- a/src/Frames/MapReduce/Maybe.hs
+++ b/src/Frames/MapReduce/Maybe.hs
@@ -99,6 +99,21 @@
 splitOnKeys = assignKeysAndData @ks @cs
 {-# INLINABLE splitOnKeys #-}
 
+-- | Assign keys and leave the rest of the columns, excluding the keys, in the data passed to reduce.
+splitOnData
+  :: forall cs rs ks record
+   . ( MG.RCastC ks rs record Maybe
+     , MG.RCastC cs rs record Maybe
+     , ks ~ F.RDeleteAll cs rs
+     )
+  => MR.Assign
+       (record (Maybe :. ElField) ks)
+       (record (Maybe :. ElField) rs)
+       (record (Maybe :. ElField) cs)
+splitOnData = assignKeysAndData @ks @cs
+{-# INLINABLE splitOnData #-}
+
+
 -- | Assign keys and leave all columns, including the keys, in the data passed to reduce.
 assignKeys
   :: forall ks rs record
