Tags:

ผมมีข้อมูลดิบตามตารางนี้ครับ

https://docs.google.com/open?id=0BxtQXMM0lbHJaXhzalRNV2J1V2M

ซึ่งเก็บข้อมูล หมายเลขชื่อคน (HN) จำนวนครั้งที่ทำ (Visit) และคะแนนที่ได้ (Total score) เป็นแต่ละ คอลัม

ผมจะเขียนอัลกอริทึม อย่างไรถึงจะใช้นับได้ว่า การมาพบครั้งต่อมาได้คะแนนดีกว่าครั้งแรก (ครั้งที่ 2 ได้มากกว่า 1 หรือครั้งที่ 3 ได้มากกว่า 2)

ให้แนวทางคร่าวๆ ก็พอครับ

Get latest news from Blognone
By: neizod
ContributorTraineeIn Love
on 17 June 2012 - 05:23 #433387
neizod's picture
  • "จำนวนครั้งที่ทำ" อันนี้ผมว่าอธิบายผิดหรือเปล่า ต้องแค่ "ครั้งที่ทำแบบทดสอบ" ก็น่าจะพอ?
  • แม้จะไม่ใช่เรื่องที่ผมจำเป็นต้องรู้ก็ในแนวทางการเขียนโปรแกรมได้ แต่เล่าหน่อยก็ดีครับ ว่าคะแนนเต็มเท่าไหร่ ทำไมคะแนนมันสวิงจังเลย เห็นมีตั้งแต่ศูนย์ถึงสามร้อยกว่าๆ
  • ถ้าคะแนนครั้งแรกดีแล้ว ส่วนครั้งถัดมาเป็น 0 อันนี้ถือว่า user error ไม่นับว่าครั้งนั้นเกิดขึ้นมั้ย?

ไม่ได้ช่วยอะไรเลยแฮะ 55 แต่ดูแล้วก็เรียงคะแนนตามคน-ครั้งที่ทำเรียบร้อย ที่เหลือก็ไม่น่ายากแล้วฮะ

By: saknarak
Android
on 17 June 2012 - 08:12 #433402
saknarak's picture

ลองนิยามเหตุการณ์นี้หน่อยครับ ว่าดีขึ้นหรือเปล่า

1 50
2 0
3 30

เพราะครั้งที่ 3 ดีกว่าครั้งที่ 2 แต่จริง ๆ แล้วแย่กว่าครั้งแรก จะให้สรุปว่าดีขึ้นหรือเปล่าครับ

ถ้าสรุปได้แล้ว อัลกอไม่ยากครับ แค่ข้อมูลเรียงตาม HN, Visit ก็สามารถเปรียบเทียบได้แล้ว

var prev_row = {};
for(row in data) {
  if (prev_row.HN != ''
      && prev_row.HN==row.HN
      && prev_row.score < row.score) {
    print row.HN, ': visit#, row.visit, ' is better than visit#', prev_row.visit;
  }
  prev_row.HN = row.HN;
  prev_row.score = row.score;
  prev_row.visit = row.visit;
}
By: Invisible Force
ContributoriPhoneAndroidUbuntu
on 17 June 2012 - 12:24 #433454
Invisible Force's picture
ปัญหาข้อนี้ จัดเป็นปัญหา Classic ครับ ถ้าหากต้องแก้ด้วยคำสั่ง SQL เพียวๆ

วิธีแก้ปัญหานั้น ขึ้นอยู่กับว่าข้อมูลถูกเก็บไว้ที่ไหนและจะใช้อะไรแก้ปัญหาครับ

1) ใช้ Excel:
  
     ก็เพียงใส่สูตรอ้างอิงกับบรรทัดก่อนหน้าเท่านั้น 
    (แต่ต้อง Sort by HN,VisitOrder ก่อน)


2) ใช้ คำสั่ง SQL (เนื่องจากปกติข้อมูลมักอยู่ใน Database อยู่แล้ว)
     
     เนื่องจากคำสั่ง SQL จะประมวลผลเฉพาะภายใน record เดียวกันเท่านั้น ดังนั้น
     เราต้อง Join ให้เกิดการ Shift ดึงข้อมูลมาไว้ record เดียวกันก่อนครับ ดังนี้

     SELECT A.*, B.*, A.totalscore-B.totalscore 
     FROM Stage as A LEFT JOIN Stage as B
     ON A.hn=B.hn AND A.visit=B.visit+1

     เพียงเท่านี้ เราก็จะสามารถคำนวณหาค่าแตกต่างระหว่างครั้งก่อนได้แล้ว 
     โดยเพิ่ม A.totalscore-B.totalscore เข้าไป 
     ต่อจากนั้น เราก็จะสามารถ WHERE หา HN ใดบ้าง ที่ได้ TotalScore เพิ่มขึ้น
     หรือลดลงจากเดิมต่อไปได้ครับ


3) ใช้ Programming Languages
 
     อันนี้ความเห็นข้างบนได้กล่าวไว้แล้วครับ

By: Nozomi
ContributorWindows PhoneAndroidSymbian
on 17 June 2012 - 14:01 #433477
Nozomi's picture

ขอบคุณครับ ทำได้ซักพักละครับ แต่ "คิดเอาเอง" ว่าโค๊ดตัวเองเขียนมันดู "เห่ยๆ" เลยอยากขอดูแนวทางที่เขียนแล้ว "สั้นลง" บ้าง ขอบคุณอีกทีครับ อิอิ ได้ไอเดียเยอะดี

By: Invisible Force
ContributoriPhoneAndroidUbuntu
on 18 June 2012 - 12:46 #433682
Invisible Force's picture

โจทย์ข้อนี้ ถ้าจะให้ยากขึ้นสำหรับการแก้ด้วย SQL นะครับ ต้องตัดค่า Visit ออกครับ .. โดยบอกว่าข้อมูลดิบเก็บเพียง วันที่, ลูกค้า, คะแนน เท่านั้น .. และให้ทำการเช็คเองว่ามีการเปลี่ยนแปลงคะแนนดีขึ้นจากครั้งก่อนหรือไม่ โดยใช้เพียงวันที่เท่านั้น