Доступ к переменной SQL 0/1, 3 критерия: 1. Значения в столбце A идентичны, 2. Значение в столбце B НЕ является самым большим, и 3. Значение в столбце C ЯВЛЯЕТСЯ самым большим

Как указано в заголовке, мне нужно запустить некоторый SQL в Access, который дает мне переменную 0/1 на основе трех критериев. Во-первых, новая переменная должна сравниваться со всеми одинаковыми значениями в столбце A. Во-вторых, он должен проверить, является ли значение в столбце B максимальным (в моем случае это не должно быть), и, в-третьих, он должен проверить, является ли значение столбца C самым большим (в моем случае это должно быть).

Обычно я бы запускал простой оператор IIf по столбцам одной строки, но здесь мне нужно сравнить все значения в столбце A, которые одинаковы, и посмотреть, есть ли «не самое большое» значение в comlum B с соответствующим «максимальным значением» в столбце C.

Я читал во многих обсуждениях, что вам нужно создать новый запрос для этой цели, но можно ли сделать это внутри запроса и получить новую переменную в столбце D, задав переменную 0/1?

Чтобы было совершенно ясно, мои данные выглядят примерно так:

A     B      C
10    4   12-04-2014
10    5   02-17-2015
10    7   08-11-2016
10    8   08-31-2016
10    6   09-05-2016

И были бы сотни тысяч строк, и где А было бы отлично от 10.

Таким образом, в этом случае только последняя строка получит значение 1 в столбце D, так как она имеет самую последнюю дату, но не является самым высоким значением в столбце B для значения идентификатора в столбце A.

Любая помощь высоко ценится!

  • Отметка

person Mark Drejer    schedule 18.12.2016    source источник
comment
Проще говоря, вы хотите иметь возможность выбрать наибольшее значение в столбце C и присвоить значение 1 соответствующей строке в столбце D. Верно?   -  person kplus    schedule 18.12.2016
comment
Не совсем. Это только первый критерий. Значение 1 в D может быть получено только в том случае, если значение в C является самым высоким, значение в B НЕ является самым высоким. И необходимо учитывать, что он может сравнивать только значения в B и C, где значение в A идентично по строкам.   -  person Mark Drejer    schedule 18.12.2016
comment
Дело в том, что мне нужно измерить возврат к данной фазе, поэтому столбец B важен, и значение не может быть самым высоким в этом столбце.   -  person Mark Drejer    schedule 18.12.2016
comment
Затем столбец A идентичен по строкам? ты имеешь в виду, то же самое на всем протяжении?   -  person kplus    schedule 18.12.2016
comment
Тем не менее, ваша точка зрения может быть использована, учитывая возможный трехэтапный подход. Если бы вы могли присвоить значение 1 в столбце D, учитывая наивысшее значение в столбце C для значения идентификатора в столбце A, а затем сделать то же самое для столбца B, т.е. дать значение 1 в столбце E, если значение в столбце B является самым высоким, учитывая значение идентификатора в столбце A. Тогда вы сможете иметь третью переменную 0/1 в столбце F, hvis дает значение 1, если столбец E равен 0, а столбец D равен 1. Можно ли это сделать ?   -  person Mark Drejer    schedule 18.12.2016
comment
Столбец A НЕ идентичен для всех строк в наборе данных. Мне нужно только сравнить столбцы B и C для строк, где значение в столбце A одинаково.   -  person Mark Drejer    schedule 18.12.2016


Ответы (2)


SELECT x.a,x.b,x.c,
  CASE
    WHEN x.b<>(SELECT max(xx.b) FROM yourtable xx WHERE xx.a=x.a)
     AND x.c=(SELECT max(xx.c) FROM yourtable xx WHERE xx.a=x.a)
    THEN 1
    ELSE 0
  END AS d
FROM yourtable x

Использование OVER (PARTITION BY xa) было бы более эффективным, но Access не позволяет этого, насколько я знаю.

person Dmitry Kurbsky    schedule 18.12.2016

В MySQL вы можете сделать это так:

select t.*,
       iif(x.b <> (select max(tt.b) from t as tt where tt.a = t.a) and
           x.b = (select max(tt.c) from t as tt where tt.a = t.a), 1, 0
          ) as flag
from t;

Вы также можете справиться с этим, используя агрегацию:

select t.*,
       iif(tt.maxb <> t.b and tt.maxc = t.c, 1, 0) as flag
from t inner join
     (select tt.a, max(tt.b) as maxb, max(t.c) as maxc
      from t as tt
      group by tt.a
     ) as tt
     on tt.a = t.a;
person Gordon Linoff    schedule 18.12.2016