diff --git a/views/views_handler_field_is_online.inc b/views/views_handler_field_is_online.inc
index 0d2b612..dba2fa6 100644
--- a/views/views_handler_field_is_online.inc
+++ b/views/views_handler_field_is_online.inc
@@ -16,13 +16,12 @@ class views_handler_field_is_online extends views_handler_field_boolean {
     $join->construct('sessions', $this->table_alias, 'uid', 'uid', array());
     $session = $this->query->ensure_table('sessions', NULL, $join);
 
-    $this->query->distinct = TRUE;
     // We use an IF for MySQL/PostgreSQL compatibility. Otherwise PostgreSQL
     // would return 'f' and 't'.
-    $sql = "IF((" . REQUEST_TIME . " - MAX($session.timestamp)) < " . variable_get('user_block_seconds_online', 900) . ", 1, 0)";
+    $sql = "IF((" . REQUEST_TIME . " - $session.timestamp) < " . variable_get('user_block_seconds_online', 900) . ", 1, 0)";
     // We liberally steal from views_handler_sort_formula and
     // views_handler_filter_search here.
-    $this->field_alias = $this->query->add_field(NULL, $sql, $this->table_alias . '_' . $this->field, array('aggregate' => TRUE));
+    $this->field_alias = $this->query->add_field(NULL, $sql, $this->table_alias . '_' . $this->field, array('function' => 'max'));
   }
 
   function option_definition() {
diff --git a/views/views_handler_filter_is_online.inc b/views/views_handler_filter_is_online.inc
index e2af7fa..24ee889 100644
--- a/views/views_handler_filter_is_online.inc
+++ b/views/views_handler_filter_is_online.inc
@@ -16,10 +16,9 @@ class views_handler_filter_is_online extends views_handler_filter_boolean_operat
     $session = $this->query->ensure_table('sessions', NULL, $join);
     // We have to make sure this field is in the query, and Views knows to
     // create GROUP BY's.
-    $sql_if_part = "IF((" . REQUEST_TIME . " - MAX($session.timestamp)) < " . variable_get('user_block_seconds_online', 900) . ", 1, 0)";
-    $this->query->add_field(NULL, $sql_if_part, $this->table_alias . '_' . $this->field, array('aggregate' => TRUE));
+    $sql_if_part = "IF((" . REQUEST_TIME . " - $session.timestamp) < " . variable_get('user_block_seconds_online', 900) . ", 1, 0)";
+    $this->query->add_field(NULL, $sql_if_part, $this->table_alias . '_' . $this->field, array('function' => 'max'));
 
-    $this->query->distinct = TRUE;
     if ($this->value == 1) {
       // Is online.
       $sql = $sql_if_part . " = 1";
@@ -28,7 +27,6 @@ class views_handler_filter_is_online extends views_handler_filter_boolean_operat
       // Is offline
       $sql = $sql_if_part . " = 0";
     }
-    $this->query->add_having($this->options['group'], $sql);
   }
 
   /**
diff --git a/views/views_handler_sort_is_online.inc b/views/views_handler_sort_is_online.inc
index 8ee657c..078409a 100644
--- a/views/views_handler_sort_is_online.inc
+++ b/views/views_handler_sort_is_online.inc
@@ -16,10 +16,9 @@ class views_handler_sort_is_online extends views_handler_sort {
     $join->construct('sessions', $this->table_alias, 'uid', 'uid', array());
     $session = $this->query->ensure_table('sessions', NULL, $join);
 
-    $this->query->distinct = TRUE;
     // We use an IF for MySQL/PostgreSQL compatibility. Otherwise PostgreSQL
     // would return 'f' and 't'.
-    $sql = "(" . REQUEST_TIME . " - MAX($session.timestamp)) < " . variable_get('user_block_seconds_online', 900);
-    $this->query->add_orderby(NULL, $sql, $this->options['order'], $this->table_alias . '_' . $this->field);
+    $sql = "IF((" . REQUEST_TIME . " - $session.timestamp) < " . variable_get('user_block_seconds_online', 900) . ", 1, 0)";
+    $this->query->add_orderby(NULL, $sql, $this->options['order'], $this->table_alias . '_' . $this->field, array('function' => 'max'));
   }
 }
