127 lines
5.0 KiB
JavaScript
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);
|