Files
genome2025/backend/check-data4.js

127 lines
5.0 KiB
JavaScript

const { Client } = require('pg');
async function main() {
const conn = new Client({
host: 'localhost',
port: 5432,
user: 'postgres',
password: 'turbo123',
database: 'genome_db'
});
await conn.connect();
const cowId = 'KOR002191643715';
const farmNo = 1;
console.log('=======================================================');
console.log('선발지수 계산 방식 비교 분석');
console.log('=======================================================\n');
// 1. 해당 개체의 35개 형질 EBV 확인
const traitsResult = await conn.query(`
SELECT trait_name, trait_ebv
FROM tb_genome_trait_detail
WHERE cow_id = $1 AND del_dt IS NULL
ORDER BY trait_name
`, [cowId]);
const traits = traitsResult.rows;
console.log('=== 개체 형질 데이터 ===');
console.log('형질 수:', traits.length);
// EBV 합계
const ebvSum = traits.reduce((sum, t) => sum + Number(t.trait_ebv || 0), 0);
console.log('EBV 합계:', ebvSum.toFixed(2));
// EBV 평균
const ebvAvg = ebvSum / traits.length;
console.log('EBV 평균:', ebvAvg.toFixed(2));
console.log('\n=== 선발지수 계산 방식 비교 ===\n');
// 방식 1: EBV 합계 (getSelectionIndex 방식)
console.log('방식1 - EBV 합계 (weightedSum):', ebvSum.toFixed(2));
// 방식 2: EBV 평균
console.log('방식2 - EBV 평균 (sum/count):', ebvAvg.toFixed(2));
// 농가/보은군 평균도 각 방식으로 계산
console.log('\n=== 농가 평균 계산 방식 비교 ===\n');
// 농가 내 모든 개체
const farmCowsResult = await conn.query(`
SELECT c.cow_id, SUM(gtd.trait_ebv) as sum_ebv, AVG(gtd.trait_ebv) as avg_ebv, COUNT(*) as cnt
FROM tb_genome_request gr
JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no
JOIN tb_genome_trait_detail gtd ON gtd.cow_id = c.cow_id AND gtd.del_dt IS NULL
WHERE gr.fk_farm_no = $1 AND gr.del_dt IS NULL AND c.del_dt IS NULL
AND gr.chip_sire_name = '일치'
GROUP BY c.cow_id
HAVING COUNT(*) = 35
`, [farmNo]);
const farmCows = farmCowsResult.rows;
// 방식 1: 개체별 합계의 평균
const farmSumAvg = farmCows.reduce((sum, c) => sum + Number(c.sum_ebv), 0) / farmCows.length;
console.log('방식1 - 개체별 합계의 평균:', farmSumAvg.toFixed(2));
// 방식 2: 개체별 평균의 평균
const farmAvgAvg = farmCows.reduce((sum, c) => sum + Number(c.avg_ebv), 0) / farmCows.length;
console.log('방식2 - 개체별 평균의 평균:', farmAvgAvg.toFixed(2));
console.log('\n=== 보은군 평균 계산 방식 비교 ===\n');
// 보은군 전체 개체
const allCowsResult = await conn.query(`
SELECT c.cow_id, SUM(gtd.trait_ebv) as sum_ebv, AVG(gtd.trait_ebv) as avg_ebv, COUNT(*) as cnt
FROM tb_genome_request gr
JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no
JOIN tb_genome_trait_detail gtd ON gtd.cow_id = c.cow_id AND gtd.del_dt IS NULL
WHERE gr.del_dt IS NULL AND c.del_dt IS NULL
AND gr.chip_sire_name = '일치'
GROUP BY c.cow_id
HAVING COUNT(*) = 35
`);
const allCows = allCowsResult.rows;
// 방식 1: 개체별 합계의 평균
const regionSumAvg = allCows.reduce((sum, c) => sum + Number(c.sum_ebv), 0) / allCows.length;
console.log('방식1 - 개체별 합계의 평균:', regionSumAvg.toFixed(2));
// 방식 2: 개체별 평균의 평균
const regionAvgAvg = allCows.reduce((sum, c) => sum + Number(c.avg_ebv), 0) / allCows.length;
console.log('방식2 - 개체별 평균의 평균:', regionAvgAvg.toFixed(2));
console.log('\n=======================================================');
console.log('결과 비교');
console.log('=======================================================\n');
console.log('만약 "합계" 방식 사용 시:');
console.log(' 내 개체:', ebvSum.toFixed(2));
console.log(' 농가 평균:', farmSumAvg.toFixed(2));
console.log(' 보은군 평균:', regionSumAvg.toFixed(2));
console.log(' → 내 개체 vs 농가: +', (ebvSum - farmSumAvg).toFixed(2));
console.log(' → 내 개체 vs 보은군: +', (ebvSum - regionSumAvg).toFixed(2));
console.log('\n만약 "평균" 방식 사용 시:');
console.log(' 내 개체:', ebvAvg.toFixed(2));
console.log(' 농가 평균:', farmAvgAvg.toFixed(2));
console.log(' 보은군 평균:', regionAvgAvg.toFixed(2));
console.log(' → 내 개체 vs 농가: +', (ebvAvg - farmAvgAvg).toFixed(2));
console.log(' → 내 개체 vs 보은군: +', (ebvAvg - regionAvgAvg).toFixed(2));
console.log('\n=======================================================');
console.log('리스트 선발지수 확인 (page.tsx의 GENOMIC_TRAITS)');
console.log('=======================================================\n');
// 리스트에서 보여주는 선발지수는 어떻게 계산되나?
// page.tsx:350-356 확인 필요
console.log('리스트의 overallScore 계산식 확인 필요:');
console.log(' - selectionIndex.score 사용 시: 합계 방식');
console.log(' - GENOMIC_TRAITS.reduce / length 사용 시: 평균 방식');
await conn.end();
}
main().catch(console.error);