37 lines
1.3 KiB
MySQL
37 lines
1.3 KiB
MySQL
|
|
-- ============================================================================
|
|||
|
|
-- SQL для очистки дубликатов в documents_meta
|
|||
|
|
-- ============================================================================
|
|||
|
|
-- Удаляет дубликаты, оставляя только самую новую запись для каждого field_name
|
|||
|
|
-- ============================================================================
|
|||
|
|
|
|||
|
|
-- $1 = claim_id (UUID)
|
|||
|
|
|
|||
|
|
UPDATE clpr_claims
|
|||
|
|
SET payload = jsonb_set(
|
|||
|
|
payload,
|
|||
|
|
'{documents_meta}',
|
|||
|
|
(
|
|||
|
|
SELECT COALESCE(jsonb_agg(doc ORDER BY (doc->>'uploaded_at') DESC NULLS LAST), '[]'::jsonb)
|
|||
|
|
FROM (
|
|||
|
|
SELECT DISTINCT ON (doc->>'field_name') doc
|
|||
|
|
FROM jsonb_array_elements(COALESCE(payload->'documents_meta', '[]'::jsonb)) AS doc
|
|||
|
|
ORDER BY
|
|||
|
|
doc->>'field_name',
|
|||
|
|
-- Приоритет: записи с file_url важнее, потом по дате
|
|||
|
|
CASE WHEN doc->>'file_url' IS NOT NULL AND doc->>'file_url' <> '' THEN 0 ELSE 1 END,
|
|||
|
|
(doc->>'uploaded_at') DESC NULLS LAST
|
|||
|
|
) unique_docs
|
|||
|
|
),
|
|||
|
|
true
|
|||
|
|
),
|
|||
|
|
updated_at = now()
|
|||
|
|
WHERE id = $1
|
|||
|
|
RETURNING
|
|||
|
|
id,
|
|||
|
|
jsonb_array_length(payload->'documents_meta') AS documents_meta_count,
|
|||
|
|
(
|
|||
|
|
SELECT jsonb_agg(doc->>'field_name')
|
|||
|
|
FROM jsonb_array_elements(payload->'documents_meta') AS doc
|
|||
|
|
) AS field_names;
|
|||
|
|
|