selectContext) {
+
+ String alias = selectContext.getNameGenerator().selectName(distinctSelect);
+
+ ConnectorSqlTables tables = selectContext.getTables();
+ SingleColumnSqlSelect preprocessingSelect =
+ MappableSingleColumnSelect.getSubstringSelect(distinctSelect.getColumn().get(), distinctSelect.getSubstringRange(), selectContext, alias);
+
+ String eventFilterTable = selectContext.getTables().cteName(ConceptCteStep.EVENT_FILTER);
+ SingleColumnSqlSelect qualified = preprocessingSelect.qualify(eventFilterTable);
+
+ FieldWrapper> grouped = new FieldWrapper<>(field("array_agg(DISTINCT {0})", Object.class, qualified.select()).as(alias), qualified.select().getName());
+
+ SingleColumnSqlSelect finalSelect = grouped.qualify(tables.cteName(ConceptCteStep.AGGREGATION_SELECT));
+
+ return ConnectorSqlSelects.builder()
+ .preprocessingSelect(preprocessingSelect)
+ .aggregationSelect(grouped)
+ .finalSelect(finalSelect)
+ .build();
+ }
+
+
+}
diff --git a/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java
new file mode 100644
index 0000000000..942f42c583
--- /dev/null
+++ b/backend/src/main/java/com/bakdata/conquery/sql/conversion/dialect/pg/PgResultSetProcessor.java
@@ -0,0 +1,140 @@
+package com.bakdata.conquery.sql.conversion.dialect.pg;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.Array;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+import com.bakdata.conquery.models.config.ConqueryConfig;
+import com.bakdata.conquery.sql.execution.ResultSetProcessor;
+import com.bakdata.conquery.sql.execution.SqlCDateSetParser;
+import com.bakdata.conquery.util.DateReader;
+import lombok.RequiredArgsConstructor;
+import org.apache.logging.log4j.util.Strings;
+
+@RequiredArgsConstructor
+public class PgResultSetProcessor implements ResultSetProcessor {
+
+ protected final ConqueryConfig config;
+ protected final SqlCDateSetParser dateSetParser;
+
+ /**
+ * Use to keep null values for primitive data types.
+ *
+ * For example, calling a primitives' ResultSet getter like getDouble, getInt etc. straightaway will never return null.
+ */
+ private static T checkForNullElseGet(ResultSet resultSet, int columnIndex, Getter getter, Class resultType) throws SQLException {
+
+ if (resultSet.getObject(columnIndex) == null) {
+ return null;
+ }
+ return resultType.cast(getter.getFromResultSet(columnIndex));
+ }
+
+ @Override
+ public String getString(ResultSet resultSet, int columnIndex) throws SQLException {
+ return resultSet.getString(columnIndex);
+ }
+
+ @Override
+ public Integer getInteger(ResultSet resultSet, int columnIndex) throws SQLException {
+ return checkForNullElseGet(resultSet, columnIndex, resultSet::getInt, Integer.class);
+ }
+
+ @Override
+ public Double getDouble(ResultSet resultSet, int columnIndex) throws SQLException {
+ return checkForNullElseGet(resultSet, columnIndex, resultSet::getDouble, Double.class);
+ }
+
+ @Override
+ public BigDecimal getMoney(ResultSet resultSet, int columnIndex) throws SQLException {
+ BigDecimal money = resultSet.getBigDecimal(columnIndex);
+ if (money == null) {
+ return null;
+ }
+ return money.setScale(2, RoundingMode.HALF_EVEN);
+ }
+
+ @Override
+ public Boolean getBoolean(ResultSet resultSet, int columnIndex) throws SQLException {
+ return checkForNullElseGet(resultSet, columnIndex, resultSet::getBoolean, Boolean.class);
+ }
+
+ @Override
+ public Integer getDate(ResultSet resultSet, int columnIndex) throws SQLException {
+ String dateString = resultSet.getString(columnIndex);
+ if (dateString == null) {
+ return null;
+ }
+ DateReader dateReader = config.getLocale().getDateReader();
+ return (int) dateReader.parseToLocalDate(dateString).toEpochDay();
+ }
+
+ @Override
+ public List getDateRange(ResultSet resultSet, int columnIndex) throws SQLException {
+ return this.dateSetParser.toEpochDayRange(resultSet.getString(columnIndex));
+ }
+
+ @Override
+ public List> getDateRangeList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return this.dateSetParser.toEpochDayRangeList(resultSet.getString(columnIndex));
+ }
+
+ @Override
+ public List getStringList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(resultSet, columnIndex);
+ }
+
+ @Override
+ public List getBooleanList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(resultSet, columnIndex);
+ }
+
+ @Override
+ public List getIntegerList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(resultSet, columnIndex);
+ }
+
+ @Override
+ public List getDoubleList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(resultSet, columnIndex);
+ }
+
+ @Override
+ public List getMoneyList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(
+ resultSet,
+ columnIndex
+ );
+ }
+
+ @Override
+ public List getDateList(ResultSet resultSet, int columnIndex) throws SQLException {
+ return list(resultSet, columnIndex);
+ }
+
+ private List