Также немного поздно, но сегодня у меня была такая же потребность, поэтому я искал в Google и, наконец, простой общий подход, найденный здесь в статье Pinal Dave http://blog.sqlauthority.com/2014/03/09 / mysql-reset-row-number-for-each-group-partition-by-row-number /
Я хотел сосредоточиться на первоначальном вопросе Павла (это тоже моя проблема) поэтому я обобщаю свое решение как рабочий пример.
Beacuse мы хотим разделить на два столбца, я бы создал переменную SET во время итерации, чтобы определить, была ли запущена новая группа.
SELECT col1, col2, col3 FROM (
SELECT col1, col2, col3,
@n := CASE WHEN @v = MAKE_SET(3, col1, col2)
THEN @n + 1 -- if we are in the same group
ELSE 1 -- next group starts so we reset the counter
END AS row_number,
@v := MAKE_SET(3, col1, col2) -- we store the current value for next iteration
FROM Table1, (SELECT @n := 0, @v := NULL) r -- helper table for iteration with startup values
ORDER BY col1, col2, col3 DESC -- because we want the row with maximum value
) x WHERE row_number = 1 -- and here we select exactly the wanted row from each group
Средство 3 при первом параметре MAKE_SET, которое я хочу, имеет значение в SET (3 = 1 | 2). Конечно, если у нас нет двух или более столбцов, строящих группы, мы можем исключить операцию MAKE_SET. Конструкция точно такая же. Это работает для меня, как требуется. Большое спасибо Пиналу Дейву за его четкую демонстрацию.
Вы правы - вызовы перегруженных методов осуществляются во время компиляции. Поэтому он статический .
Вызов переопределенных методов реализуется во время выполнения в зависимости от типа, для которого этот метод вызывается.
Википедия о виртуальных методах говорит:
В Java все нестатические методы по умолчанию являются «виртуальными функциями». Только методы, отмеченные ключевым словом final, не являются виртуальными. Методы
final
не могут быть переопределены, поэтому они реализованы статически.
Представьте себе метод:
public String analyze(Interface i) {
i.analyze();
return i.getAnalysisDetails();
}
Компилятор не может перегрузить этот метод для всех реализаций интерфейса
, которые могут быть ему переданы.
Я не думаю, что вы можете назвать перегрузку каким-либо полиморфизмом. Перегруженные методы связываются во время компиляции, что не позволяет называть это полиморфизмом.
Полиморфизм относится к динамической привязке метода к его вызову, когда вы используете ссылку на базовый класс для объекта производного класса. Переопределение методов - это то, как вы реализуете это полиморфное поведение.
Перегрузка методов означает создание нескольких версий функции на основе входных данных. Например:
public Double doSomething(Double x) { ... }
public Object doSomething(Object y) { ... }
Выбор метода для вызова осуществляется во время компиляции. Например:
Double obj1 = new Double();
doSomething(obj1); // calls the Double version
Object obj2 = new Object();
doSomething(obj2); // calls the Object version
Object obj3 = new Double();
doSomething(obj3); // calls the Object version because the compilers see the
// type as Object
// This makes more sense when you consider something like
public void myMethod(Object o) {
doSomething(o);
}
myMethod(new Double(5));
// inside the call to myMethod, it sees only that it has an Object
// it can't tell that it's a Double at compile time
Переопределение метода означает определение новой версии метода подклассом исходного
class Parent {
public void myMethod() { ... }
}
class Child extends Parent {
@Override
public void myMethod() { ... }
}
Parent p = new Parent();
p.myMethod(); // calls Parent's myMethod
Child c = new Child();
c.myMethod(); // calls Child's myMethod
Parent pc = new Child();
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime
// rather than compile time
Надеюсь, это поможет