我正在构建一个使用Persistent来提取数据的CRUD应用程序,并执行一些相当复杂的查询,例如使用窗口函数。由于Persistent或Esqueleto都不支持这些,我需要使用原始sql。
一个很好的例子是我想选择值与前一个值没有很大偏差的行,所以在伪sql中条件是WHERE val - lag(val) <= x
。我需要在SQL中运行这个选择,而不是拉动所有数据然后在Haskell中进行过滤,因为否则我有办法处理大量数据。
这些查询返回许多列。但是,RawSql
实例在具有8个元素的元组中最大化。所以现在我正在编写其他函数from9, to9, from10, to10
等等。之后,所有这些都使用类型为(Single a, Single b, ...) -> DesiredType
的函数进行转换。虽然使用代码生成可以缩短这种方法,但这种方法简直就是hacky,显然并不像Haskell那样好。这让我很担心,因为我认为我的大多数查询都需要rawSql
。
您对如何改善这一点有什么建议吗?目前,我的主要想法是取消规范化数据库和重复数据,例如通过将滞后值包含为列,以便我可以使用Esqueleto查询数据。