2017-02-22 10 views
2

Я ожидаю следующее, чтобы получить более трех строк, так как в каждом из символов есть связь min (a. [Sepal.Width]). [Species], однако только 3 строки возвращаются:SQLite удаляет связи в группе по

sqldf(' select a.[Species], min(a.[Petal.Width]) from iris a group by a.[Species] ') 
    Species min(a.[Petal.Width]) 
1  setosa     0.1 
2 versicolor     1.0 
3 virginica     1.4 
  • 1: Является ли это нормальное поведение SQLite?

  • 2: Как создать строку выбора, чтобы также вернуть связи? (предпочтительно как можно ближе к исходной строке поиска как можно)

Edit: Теперь я вижу, что моя путаница обусловлена ​​используются для использования SAS ргоса SQL, который будет возвращать все соответствующие строки. Теперь я узнал, что это действительно характерно для SAS proc SQL и не следует ожидать от других воплощений SQL. Люди с той же SAS-индуцированной путаницы, как мне будет извлечь выгоду из этого ответа, который артикулировать это поведение SAS: https://stackoverflow.com/a/25539916/1831980

+2

Вы в замешательстве. Я запутался. Каким будет значение * максимума *, связанного с запросом на минимальном *? И запрос 'GROUP BY' возвращает одну строку для каждой группы. Период. Один ряд на группу. –

+1

Да, с 'group by' он вернет одну строку для каждой группы. –

ответ

2

Это, как я хотел бы сделать это:

sqldf::sqldf('SELECT b.[Species], b.[Petal.Width] FROM iris b JOIN 
      (SELECT [Species], MIN([Petal.Width]) AS [Petal.Width] 
       FROM iris GROUP BY [Species]) a 
      USING ([Species],[Petal.Width])') 
1

Я подозреваю, что это то, что вы хотите:

select i.* 
from iris i 
where i.sepal_width = (select max(i2.sepal_width) 
         from iris i2 
         where i2.species = i.species 
        );