feat(1c): add read-only companies export layer

This commit is contained in:
igor04091968
2026-05-22 10:46:06 +03:00
parent 31fe43f4bc
commit 02e896b05a
13 changed files with 214 additions and 17 deletions
@@ -16,6 +16,15 @@ CREATE TABLE IF NOT EXISTS analytics_1c.raw_1c_postings
ENGINE = MergeTree
ORDER BY (ingested_at, source_file);
CREATE TABLE IF NOT EXISTS analytics_1c.raw_1c_companies
(
ingested_at DateTime DEFAULT now(),
source_file String,
payload String
)
ENGINE = MergeTree
ORDER BY (ingested_at, source_file);
CREATE TABLE IF NOT EXISTS analytics_1c.raw_reglog
(
ingested_at DateTime DEFAULT now(),
@@ -32,6 +32,27 @@ CREATE TABLE IF NOT EXISTS analytics_1c.postings
ENGINE = MergeTree
ORDER BY (infobase, ts, registrar);
CREATE TABLE IF NOT EXISTS analytics_1c.companies
(
ts DateTime,
infobase LowCardinality(String),
company_name String,
organization String,
owner_user String,
base_id String,
base_path String,
status LowCardinality(String),
db_size_bytes UInt64,
reglog_size_bytes UInt64,
active_locks UInt32,
temp_db_present UInt8,
scheduler_touched UInt8,
activity_score Float32,
source_file String
)
ENGINE = MergeTree
ORDER BY (infobase, ts);
CREATE TABLE IF NOT EXISTS analytics_1c.reglog_events
(
ts DateTime,
+3 -3
View File
@@ -1,4 +1,4 @@
CREATE VIEW IF NOT EXISTS analytics_1c.v_documents_daily AS
CREATE OR REPLACE VIEW analytics_1c.v_documents_daily AS
SELECT
toDate(ts) AS d,
infobase,
@@ -10,7 +10,7 @@ SELECT
FROM analytics_1c.documents
GROUP BY d, infobase, organization, doc_type;
CREATE VIEW IF NOT EXISTS analytics_1c.v_detections_daily AS
CREATE OR REPLACE VIEW analytics_1c.v_detections_daily AS
SELECT
toDate(ts) AS d,
infobase,
@@ -20,7 +20,7 @@ SELECT
FROM analytics_1c.detections
GROUP BY d, infobase, severity;
CREATE VIEW IF NOT EXISTS analytics_1c.v_open_cases AS
CREATE OR REPLACE VIEW analytics_1c.v_open_cases AS
SELECT *
FROM analytics_1c.cases
WHERE status != 'closed';
@@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS analytics_1c.company_health_signals
ENGINE = MergeTree
ORDER BY (generated_at, severity, infobase, counterparty, signal_id);
CREATE VIEW IF NOT EXISTS analytics_1c.v_counterparty_daily AS
CREATE OR REPLACE VIEW analytics_1c.v_counterparty_daily AS
SELECT
toDate(ts) AS d,
infobase,
@@ -56,7 +56,7 @@ FROM analytics_1c.documents
WHERE counterparty != ''
GROUP BY d, infobase, organization, counterparty;
CREATE VIEW IF NOT EXISTS analytics_1c.v_counterparty_latest_activity AS
CREATE OR REPLACE VIEW analytics_1c.v_counterparty_latest_activity AS
SELECT
infobase,
organization,
@@ -72,17 +72,36 @@ FROM analytics_1c.documents
WHERE counterparty != ''
GROUP BY infobase, organization, counterparty;
CREATE VIEW IF NOT EXISTS analytics_1c.v_company_forecasts_current AS
CREATE OR REPLACE VIEW analytics_1c.v_company_forecasts_current AS
SELECT *
FROM analytics_1c.company_forecasts
WHERE generated_at = (SELECT max(generated_at) FROM analytics_1c.company_forecasts);
CREATE VIEW IF NOT EXISTS analytics_1c.v_company_health_current AS
CREATE OR REPLACE VIEW analytics_1c.v_company_health_current AS
SELECT *
FROM analytics_1c.company_health_signals
WHERE generated_at = (SELECT max(generated_at) FROM analytics_1c.company_health_signals);
CREATE VIEW IF NOT EXISTS analytics_1c.v_company_portfolio_overview AS
CREATE OR REPLACE VIEW analytics_1c.v_companies_current AS
SELECT
infobase,
argMax(company_name, ts) AS company_name,
argMax(organization, ts) AS organization,
argMax(owner_user, ts) AS owner_user,
argMax(base_id, ts) AS base_id,
argMax(base_path, ts) AS base_path,
argMax(status, ts) AS current_status,
argMax(db_size_bytes, ts) AS db_size_bytes,
argMax(reglog_size_bytes, ts) AS reglog_size_bytes,
argMax(active_locks, ts) AS active_locks,
argMax(temp_db_present, ts) AS temp_db_present,
argMax(scheduler_touched, ts) AS scheduler_touched,
argMax(activity_score, ts) AS current_activity_score,
max(ts) AS last_company_snapshot_at
FROM analytics_1c.companies
GROUP BY infobase;
CREATE OR REPLACE VIEW analytics_1c.v_company_portfolio_overview AS
WITH
base AS
(
@@ -113,6 +132,11 @@ d30 AS
WHERE d >= today() - 30
GROUP BY infobase, counterparty
),
company_state AS
(
SELECT *
FROM analytics_1c.v_companies_current
),
signals AS
(
SELECT
@@ -169,12 +193,24 @@ detections_current AS
)
SELECT
base.infobase AS infobase,
base.organization,
if(company_state.organization != '', company_state.organization, base.organization) AS organization,
base.counterparty AS counterparty,
if(company_state.company_name != '', company_state.company_name, base.counterparty) AS company_name,
ifNull(company_state.owner_user, '') AS owner_user,
ifNull(company_state.base_id, '') AS base_id,
ifNull(company_state.base_path, '') AS base_path,
base.last_seen_at,
company_state.last_company_snapshot_at,
base.last_doc_type,
base.last_operation_type,
base.last_status,
ifNull(company_state.current_status, base.last_status) AS current_status,
ifNull(company_state.db_size_bytes, 0) AS db_size_bytes,
ifNull(company_state.reglog_size_bytes, 0) AS reglog_size_bytes,
ifNull(company_state.active_locks, 0) AS active_locks,
ifNull(company_state.temp_db_present, 0) AS temp_db_present,
ifNull(company_state.scheduler_touched, 0) AS scheduler_touched,
ifNull(company_state.current_activity_score, 0) AS current_activity_score,
dateDiff('day', toDate(base.last_seen_at), today()) AS days_since_last_activity,
ifNull(d7.docs_7d, 0) AS docs_7d,
ifNull(d7.amount_7d, 0) AS amount_7d,
@@ -192,6 +228,7 @@ SELECT
ifNull(signals.signal_score, 0) AS signal_score,
ifNull(signals.top_signal, '') AS top_signal
FROM base
LEFT JOIN company_state ON company_state.infobase = base.infobase
LEFT JOIN d7 ON d7.infobase = base.infobase AND d7.counterparty = base.counterparty
LEFT JOIN d30 ON d30.infobase = base.infobase AND d30.counterparty = base.counterparty
LEFT JOIN signals ON signals.infobase = base.infobase AND signals.counterparty = base.counterparty