WITH guesses AS (
SELECT
word,
SUBSTRING(word, 1, 1) letter_one,
SUBSTRING(word, 2, 1) letter_two,
SUBSTRING(word, 3, 1) letter_three,
SUBSTRING(word, 4, 1) letter_four,
SUBSTRING(word, 5, 1) letter_five
FROM public.wordle
), answers AS (
SELECT
word,
SUBSTRING(word, 1, 1) letter_one,
SUBSTRING(word, 2, 1) letter_two,
SUBSTRING(word, 3, 1) letter_three,
SUBSTRING(word, 4, 1) letter_four,
SUBSTRING(word, 5, 1) letter_five
FROM answer
), crossjoin AS (
SELECT
g1.word AS g1,
g2.word AS g2,
answers.word AS answer,
CASE
WHEN answers.letter_one IN (g1.letter_one, g1.letter_two, g1.letter_three, g1.letter_four, g1.letter_five, g2.letter_one, g2.letter_two, g2.letter_three, g2.letter_four, g2.letter_five) THEN 1
ELSE 0
END AS a1_match,
CASE
WHEN answers.letter_two IN (g1.letter_one, g1.letter_two, g1.letter_three, g1.letter_four, g1.letter_five, g2.letter_one, g2.letter_two, g2.letter_three, g2.letter_four, g2.letter_five) THEN 1
ELSE 0
END AS a2_match,
CASE
WHEN answers.letter_three IN (g1.letter_one, g1.letter_two, g1.letter_three, g1.letter_four, g1.letter_five, g2.letter_one, g2.letter_two, g2.letter_three, g2.letter_four, g2.letter_five) THEN 1
ELSE 0
END AS a3_match,
CASE
WHEN answers.letter_four IN (g1.letter_one, g1.letter_two, g1.letter_three, g1.letter_four, g1.letter_five, g2.letter_one, g2.letter_two, g2.letter_three, g2.letter_four, g2.letter_five) THEN 1
ELSE 0
END AS a4_match,
CASE
WHEN answers.letter_five IN (g1.letter_one, g1.letter_two, g1.letter_three, g1.letter_four, g1.letter_five, g2.letter_one, g2.letter_two, g2.letter_three, g2.letter_four, g2.letter_five) THEN 1
ELSE 0
END AS a5_match
FROM guesses g1
CROSS JOIN guesses g2
CROSS JOIN answers
), count_answers AS (
SELECT
g1,
g2,
answer,
a1_match + a2_match + a3_match + a4_match + a5_match AS total
FROM crossjoin
), maths_agg AS (
SELECT
g1,
g2,
SUM(total) sum,
AVG(total) avg,
stddev(total) stddev,
MAX(total) max,
MIN(total) min
FROM count_answers
GROUP BY g1, g2
), final AS (
SELECT
*
FROM maths_agg
)
SELECT
*
FROM final
order by avg desc
limit 200