It's a result of your relationships: you're connecting each order item to the product it represents and then each product to each node that references it. Because of the way that database query works, it returns a unique result for every combination and renders them into your View.
Judging by your View's configuration, this was the simplest way for it to include the course type, teacher, etc. fields from the node. You're going to have to filter the result set somehow ... unfortunately, the data you need to be able to do that (the add to cart context from the $line_item->data array) isn't exposed to Views.
To see how that array gets built, check out
commerce_cart_field_attach_view_alter(). You have two basic options for that data: create a custom Views filter that will allow you to filter the result set of your Views based on the values in the
$line_item->data['context']['entity'] array or else remove the relationship from the View and switch to rendering the line item using a custom view mode, loading the data you need from the related entities manually.
(Note: I was going to suggest that if you only have one active node selling each product at any given point in time (unclear from your question), you could just add a filter to your View that checks to ensure the node referencing the product is published. That would get rid of the duplication but screw up your historical orders who now appear to show the wrong content.)