I found the answer here. While I admit this works for my application, I'm not sure on what exactly the code is doing, sure, you're interrogating a query with another query to see if there are any grandchildren, however a little lost on the details of what the implode() is for.
<?php
// set the id of current page
$gen1_ids = get_the_ID();
// query the id for children (or at least that's what I think this query does)
$gen2 = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen1_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC");
$gen2_ids = implode($gen2,', ');
//query children if they have children
$gen3 = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen2_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC");
$gen3_ids = implode($gen3,', ');
$args=array(
'post__in' => $gen3,
'post_type' => 'page',
'post_status' => 'publish',
'posts_per_page' => -1,
'caller_get_posts'=> 1
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
// Your while code here
endwhile;
} //endif
wp_reset_query(); // Restore global post data stomped by the_post().
?>