	private static abstract class CteDefs
	{
		// TODO Share same named columns using some "Any"?
		// jOOQ doesn't work that way for normal tables, each column is recognized on its own.
		// Each CTE is like a table with columns -> 1 class with fields like normal tables.
		// -> leads to lots of duplicates, because most field names+types are used in many CTEs
		// -> jOOQ could handle such things in case views are used. But really put each CTE as view
		// into the model? -> lots of changes -> easier with Java-only

		private static abstract class TimePeriod
		{
			private static final Name					CTE				= DSL.name("time_period");
			private static final Field<OffsetDateTime>	COL_START_AT	= DSL.field("start_at",	SQLDataType.OFFSETDATETIME);
			private static final Field<OffsetDateTime>	COL_END_AT		= DSL.field("end_at",	SQLDataType.OFFSETDATETIME);
		}

		private static abstract class RecsInTimePeriod
		{
			private static final Name					CTE							= DSL.name("recs_in_time_period");
			private static final Field<Integer>			COL_RC_USER_ID				= DSL.field("rc_user_id",			READING_COMPANY.USER_ID.getDataType());
			private static final Field<String>			COL_REAL_ESTATE_NR			= DSL.field("real_estate_nr",		REAL_ESTATE.NUMBER.getDataType());
			private static final Field<String>			COL_CLT_MAC					= DSL.field("clt_mac",				COLLECTOR.MAC_ADDRESS.getDataType());
			private static final Field<Long>			COL_CLT_REC_ID				= DSL.field("clt_rec_id",			CLT_REC.ID.getDataType());
			private static final Field<OffsetDateTime>	COL_CLT_REC_CAPTURED_AT		= DSL.field("clt_rec_captured_at",	CLT_REC.CAPTURED_AT.getDataType());
			private static final Field<MeterMfctCode>	COL_METER_MFCT_CODE			= DSL.field("meter_mfct_code",		METER.MFCT_CODE.getDataType());
			private static final Field<String>			COL_METER_READING_SERIAL	= DSL.field("meter_reading_serial",	METER.READING_SERIAL.getDataType());
			private static final Field<MeterType>		COL_METER_TYPE				= DSL.field("meter_type",			METER.TYPE.getDataType());
		}

		private static abstract class ReAndCltPerMeterLid
		{
			private static final Name					CTE								= DSL.name("re_and_clt_per_meter_lid");
			private static final Field<MeterMfctCode>	COL_METER_MFCT_CODE				= DSL.field("meter_mfct_code",				METER.MFCT_CODE.getDataType());
			private static final Field<String>			COL_METER_READING_SERIAL		= DSL.field("meter_reading_serial",			METER.READING_SERIAL.getDataType());
			private static final Field<MeterType>		COL_METER_TYPE					= DSL.field("meter_type",					METER.TYPE.getDataType());
			private static final Field<String>			COL_REAL_ESTATE_NR				= DSL.field("real_estate_nr",				REAL_ESTATE.NUMBER.getDataType());
			private static final Field<String>			COL_CLT_MAC						= DSL.field("clt_mac",						COLLECTOR.MAC_ADDRESS.getDataType());
			private static final Field<Integer>			COL_METER_LID_CNT				= DSL.field("meter_lid_cnt",				DSL.count().getDataType());
			private static final Field<OffsetDateTime>	COL_METER_LID_LAST_CAPTURED_AT	= DSL.field("meter_lid_last_captured_at",	CteDefs.RecsInTimePeriod.COL_CLT_REC_CAPTURED_AT.getDataType());
		}

		private static abstract class MostLikelyReAndCltPerMeterLid
		{
			private static final Name					CTE							= DSL.name("most_likely_re_and_clt_per_meter_lid");
			private static final Field<MeterMfctCode>	COL_METER_MFCT_CODE			= DSL.field("meter_mfct_code",		METER.MFCT_CODE.getDataType());
			private static final Field<String>			COL_METER_READING_SERIAL	= DSL.field("meter_reading_serial",	METER.READING_SERIAL.getDataType());
			private static final Field<MeterType>		COL_METER_TYPE				= DSL.field("meter_type",			METER.TYPE.getDataType());
			private static final Field<String>			COL_REAL_ESTATE_NR			= DSL.field("real_estate_nr",		REAL_ESTATE.NUMBER.getDataType());
			private static final Field<String>			COL_CLT_MAC					= DSL.field("clt_mac",				COLLECTOR.MAC_ADDRESS.getDataType());
		}

		private static abstract class RcPerMeterLid
		{
			private static final Name					CTE							= DSL.name("rc_per_meter_lid");
			private static final Field<MeterMfctCode>	COL_METER_MFCT_CODE			= DSL.field("meter_mfct_code",		METER.MFCT_CODE.getDataType());
			private static final Field<String>			COL_METER_READING_SERIAL	= DSL.field("meter_reading_serial",	METER.READING_SERIAL.getDataType());
			private static final Field<MeterType>		COL_METER_TYPE				= DSL.field("meter_type",			METER.TYPE.getDataType());
			private static final Field<Integer>			COL_RC_USER_ID				= DSL.field("rc_user_id",			READING_COMPANY.USER_ID.getDataType());
		}

		private static abstract class SummaryWoTimePeriod
		{
			private static final Name			CTE					= DSL.name("summary_wo_time_period");
			private static final Field<Integer>	COL_RC_USER_ID		= DSL.field("rc_user_id",		READING_COMPANY.USER_ID.getDataType());
			private static final Field<String>	COL_REAL_ESTATE_NR	= DSL.field("real_estate_nr",	REAL_ESTATE.NUMBER.getDataType());
			private static final Field<String>	COL_CLT_MAC			= DSL.field("clt_mac",			COLLECTOR.MAC_ADDRESS.getDataType());
			private static final Field<Integer>	COL_METER_CNT		= DSL.field("meter_cnt",		DSL.count().getDataType());
		}

		private static abstract class SummaryWithTimePeriod
		{
			private static final Name					CTE					= DSL.name("summary_with_time_period");
			private static final Field<Integer>			COL_RC_USER_ID		= DSL.field("rc_user_id",			READING_COMPANY.USER_ID.getDataType());
			private static final Field<String>			COL_REAL_ESTATE_NR	= DSL.field("real_estate_nr",		REAL_ESTATE.NUMBER.getDataType());
			private static final Field<String>			COL_CLT_MAC			= DSL.field("clt_mac",				COLLECTOR.MAC_ADDRESS.getDataType());
			private static final Field<Integer>			COL_METER_CNT		= DSL.field("meter_cnt",			DSL.count().getDataType());
			private static final Field<OffsetDateTime>	COL_TP_START_AT		= DSL.field("time_period_start_at",	CLT_REC.CAPTURED_AT.getDataType());
			private static final Field<OffsetDateTime>	COL_TP_END_AT		= DSL.field("time_period_end_at",	CLT_REC.CAPTURED_AT.getDataType());
		}
	}