98 lines
3.9 KiB
JavaScript
98 lines
3.9 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();
|
|
|
|
// getComparisonAverages가 계산하는 방식 확인
|
|
// 농가 1번의 카테고리별 평균 EBV 계산
|
|
const farmNo = 1;
|
|
|
|
// 카테고리 매핑 (백엔드와 동일)
|
|
const TRAIT_CATEGORY_MAP = {
|
|
'12개월령체중': '성장',
|
|
'도체중': '생산', '등심단면적': '생산', '등지방두께': '생산', '근내지방도': '생산',
|
|
'체고': '체형', '십자': '체형', '체장': '체형', '흉심': '체형', '흉폭': '체형',
|
|
'고장': '체형', '요각폭': '체형', '곤폭': '체형', '좌골폭': '체형', '흉위': '체형',
|
|
'안심weight': '무게', '등심weight': '무게', '채끝weight': '무게', '목심weight': '무게',
|
|
'앞다리weight': '무게', '우둔weight': '무게', '설도weight': '무게', '사태weight': '무게',
|
|
'양지weight': '무게', '갈비weight': '무게',
|
|
'안심rate': '비율', '등심rate': '비율', '채끝rate': '비율', '목심rate': '비율',
|
|
'앞다리rate': '비율', '우둔rate': '비율', '설도rate': '비율', '사태rate': '비율',
|
|
'양지rate': '비율', '갈비rate': '비율',
|
|
};
|
|
|
|
// 농가 1번의 모든 형질 데이터 조회
|
|
const result = await conn.query(`
|
|
SELECT gtd.trait_name, gtd.trait_ebv
|
|
FROM tb_genome_trait_detail gtd
|
|
JOIN tb_genome_request gr ON gtd.fk_request_no = gr.pk_request_no
|
|
WHERE gr.fk_farm_no = $1
|
|
AND gtd.del_dt IS NULL
|
|
AND gtd.trait_ebv IS NOT NULL
|
|
`, [farmNo]);
|
|
|
|
const details = result.rows;
|
|
console.log('농가 1번 전체 형질 데이터 수:', details.length);
|
|
|
|
// 카테고리별로 합계 계산
|
|
const categoryMap = {};
|
|
for (const d of details) {
|
|
const category = TRAIT_CATEGORY_MAP[d.trait_name] || '기타';
|
|
if (!categoryMap[category]) {
|
|
categoryMap[category] = { sum: 0, count: 0 };
|
|
}
|
|
categoryMap[category].sum += Number(d.trait_ebv);
|
|
categoryMap[category].count += 1;
|
|
}
|
|
|
|
console.log('\n=== getComparisonAverages 방식 (카테고리별 평균) ===');
|
|
const categories = ['성장', '생산', '체형', '무게', '비율'];
|
|
let totalAvgEbv = 0;
|
|
for (const cat of categories) {
|
|
const data = categoryMap[cat];
|
|
const avgEbv = data ? data.sum / data.count : 0;
|
|
console.log(`${cat}: 합계=${data?.sum?.toFixed(2)} / 개수=${data?.count} = 평균 ${avgEbv.toFixed(2)}`);
|
|
totalAvgEbv += avgEbv;
|
|
}
|
|
|
|
console.log('\n*** farmAvgZ (카테고리 평균의 합/5):', (totalAvgEbv / categories.length).toFixed(2));
|
|
|
|
// getSelectionIndex 방식 비교
|
|
console.log('\n=== getSelectionIndex 방식 (개체별 합계의 평균) ===');
|
|
const farmCowsResult = await conn.query(`
|
|
SELECT c.cow_id, SUM(gtd.trait_ebv) as total_ebv, COUNT(*) as trait_count
|
|
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
|
|
ORDER BY total_ebv DESC
|
|
`, [farmNo]);
|
|
const farmCows = farmCowsResult.rows;
|
|
|
|
let farmSum = 0;
|
|
farmCows.forEach(c => farmSum += Number(c.total_ebv));
|
|
const farmAvgScore = farmCows.length > 0 ? farmSum / farmCows.length : 0;
|
|
|
|
console.log(`개체수: ${farmCows.length}`);
|
|
console.log(`*** farmAvgScore (개체별 합계의 평균): ${farmAvgScore.toFixed(2)}`);
|
|
|
|
console.log('\n=================================================');
|
|
console.log('farmAvgZ (카테고리 방식):', (totalAvgEbv / categories.length).toFixed(2));
|
|
console.log('farmAvgScore (선발지수 방식):', farmAvgScore.toFixed(2));
|
|
console.log('=================================================');
|
|
|
|
await conn.end();
|
|
}
|
|
|
|
main().catch(console.error);
|