Insignias por número de temas fijados / ¿Insignia SQL?

Nuestra comunidad se centra en temas fijados y temas fijados globalmente. Lamentablemente, no hay ningún contador de estadísticas para esto en las páginas de perfil de los usuarios, y parece que los temas fijados o fijados globalmente no se almacenan de manera sistemática en ninguna parte de la base de datos.

Ante esto, estoy buscando una manera de otorgar insignias, al menos por ejemplo: “Primer tema fijado”, “10 temas fijados”, “100 temas fijados”, así como para temas fijados globalmente.

¿Podría alguien ayudarme con el SQL para las insignias de este tipo?

Mi punto de partida:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.unpinned IS NOT NULL
GROUP BY p.user_id
HAVING count(*) > 5

Pero esto me da el error:

ERROR: column t.unpinned does not exist
LINE 6: WHERE t.unpinned IS NOT NULL

Supongo que tengo que usar unpinned, ya que, hasta donde sé, no hay otro punto de datos que se mantenga en los temas que alguna vez han sido fijados, o ¿podría usar post_actions aquí?

¿O tal vez buscar el primer mensaje en un tema de un usuario del personal/sistema que contenga “fijado hace …” para contar? action_code => pinned.disabled

Actualización: Esto parece funcionar de alguna manera…

SELECT t.user_id, current_timestamp granted_at
FROM badge_posts p
INNER JOIN topics t on t.id = p.topic_id
WHERE p.action_code ilike 'pinned.disabled'
GROUP BY t.user_id
HAVING count(*) > 0

Pero no estoy seguro de si este es el mejor enfoque, y como un mensaje puede ser fijado y desfijado varias veces… no estoy seguro de si esta consulta solo captura UN pinned.disabled por topic.id.

Agradecería la ayuda de un experto en SQL de insignias.

O también considerar almacenar los fijados de manera sistemática en la base de datos, como los “me gusta”, etc., a partir de ahora, y mostrarlos en la sección de Estadísticas del perfil del usuario y debajo con enlaces como “TE FIJARON”. Porque si un tema se fija, es un reconocimiento mucho mayor en comparación con los “me gusta” y debería tenerse en cuenta.

Actualización:

Lo resolví por mí mismo. Aquí está la consulta final de insignia:

WITH unpinned AS ( /* Obtener publicaciones de temas elegibles con al menos un pinned.disabled */
	SELECT t.user_id, t.id
	FROM badge_posts p
	INNER JOIN topics t on t.id = p.topic_id
	WHERE p.action_code ilike 'pinned.disabled'
	GROUP BY t.id, t.user_id
	HAVING count(*) > 0
)
SELECT user_id, count(*), current_timestamp granted_at 
FROM unpinned
GROUP BY user_id
HAVING count(*) > 0

El último conteo debe cambiarse al número de temas que alguna vez estuvieron fijados, por ejemplo: >0 significa al menos un tema fijado, >10 al menos 10 temas que estuvieron fijados.

Tuve que usar el truco de pinned.disabled, ya que Discourse no tiene ningún otro punto de datos sobre el historial de fijaciones disponible en la base de datos. Además, no es posible distinguir esta consulta entre fijaciones regulares y fijaciones globales debido a la falta de datos disponibles.

En mi opinión, esto debería cambiarse de ahora en adelante, ya que, para las estadísticas de participación, debería considerarse: fijación global > fijación regular > comentarios > me gusta > vistas, pero actualmente no se tienen en cuenta en absoluto.