SQL выберите max, а затем отобразите значение меньше максимального - PullRequest
0 голосов
/ 13 марта 2012

Для приведенного ниже кода я хотел бы посмотреть, есть ли способ выбрать самый высокий обороты.число в столбце PATTERN.VERSION, а затем отображаются только результаты, которые ниже этого значения.

Дата в столбце отображается следующим образом:

Version
--------
2012-03-12 rev. 035    
2012-03-12 rev.035    
2012-03-12 rev.017

В этом случае мне бы хотелось, чтобызапросите выбор максимального значения rev.035 и затем отобразите только те значения, которые ниже (rev. 017).Я попытался сделать это с агрегатом MAX и подзапросом с меньшим, но не смог получить правильный результат.

    SELECT DISTINCT "SEM_AGENT"."DELETED"
   ,"PATTERN"."VERSION" 
  ,"PATTERN"."PATTERNDATE"
  ,"SEM_AGENT"."AGENT_VERSION"
  ,"SEM_CLIENT"."COMPUTER_NAME" "Computer Name"
  , "SEM_COMPUTER"."OPERATION_SYSTEM" "Operation System"
  ,dateadd(s,convert(bigint,"SEM_AGENT"."CREATION_TIME")/1000,'01-01-1970 00:00:00') CREATION_DTTM
  , dateadd(s,convert(bigint,"SEM_AGENT"."LAST_UPDATE_TIME")/1000,'01-01-1970 00:00:00') Lastupdatetime
  , DATEADD(s, convert(bigint,LAST_SCAN_TIME)/1000, '01-01-1970 00:00:00')"Last Scan Time"
  , "PATTERN"."PATTERNDATE" "Pattern Date"
  , "SEM_CLIENT"."USER_NAME" "User Name"
  , "V_SEM_COMPUTER"."IP_ADDR1_TEXT" "IP Address"
  , "IDENTITY_MAP"."NAME" "Group Name"
FROM (((("SEM_AGENT" "SEM_AGENT" INNER JOIN "SEM_CLIENT" "SEM_CLIENT" 
  ON (("SEM_AGENT"."COMPUTER_ID"="SEM_CLIENT"."COMPUTER_ID") 
  AND ("SEM_AGENT"."DOMAIN_ID"="SEM_CLIENT"."DOMAIN_ID")) 
  AND ("SEM_AGENT"."GROUP_ID"="SEM_CLIENT"."GROUP_ID")) INNER JOIN "SEM_COMPUTER" "SEM_COMPUTER" 
  ON (("SEM_AGENT"."COMPUTER_ID"="SEM_COMPUTER"."COMPUTER_ID") 
  AND ("SEM_AGENT"."DOMAIN_ID"="SEM_COMPUTER"."DOMAIN_ID")) 
  AND ("SEM_AGENT"."DELETED"="SEM_COMPUTER"."DELETED")) INNER JOIN "PATTERN" "PATTERN" 
  ON "SEM_AGENT"."PATTERN_IDX"="PATTERN"."PATTERN_IDX") INNER JOIN "IDENTITY_MAP" "IDENTITY_MAP" 
  ON "SEM_CLIENT"."GROUP_ID"="IDENTITY_MAP"."ID") INNER JOIN "V_SEM_COMPUTER" "V_SEM_COMPUTER" 
  ON "SEM_COMPUTER"."COMPUTER_ID"="V_SEM_COMPUTER"."COMPUTER_ID" 
  AND "SEM_AGENT"."DELETED"=0


ORDER BY "Computer Name"

SAMPLE ROWS

IP Address  DELETED VERSION PATTERNDATE AGENT_VERSION   Computer Name   Operation System    CREATION_DTTM   Lastupdatetime  Last Scan Time  Pattern Date    User Name   Group Name  ip_address  device_type user_tag
16X.XX.XX.XX    0   2012-03-13 rev. 002 3/13/2012 12:00:00 AM   12.1.671.4971   MD-EISN-1206    Windows XP Professional     11/10/2011 8:25:46 PM   3/13/2012 7:49:25 PM    3/11/2012 1:00:05 PM    3/13/2012 12:00:00 AM   ECOPYSCAN   My Company\AHRQ\eCOPY-machines  16X.XX.XX.XX    Desktop |fisma-mgmt|fisma-all|
16X.XX.XX.XX    0   2012-03-13 rev. 002 3/13/2012 12:00:00 AM   12.1.671.4971   HHS-46801948    Windows XP Professional     11/10/2011 8:25:46 PM   3/13/2012 7:49:25 PM    3/11/2012 12:00:02 PM   3/13/2012 12:00:00 AM   EcopyIOD    My Company\AHRQ\eCOPY-machines  16X.XX.XX.XX    Desktop |workstations|network scanners|fisma-mgmt|desktops|fisma-all|
16X.XX.XX.XX    0   2012-03-13 rev. 002 3/13/2012 12:00:00 AM   12.1.671.4971   HHS-46801937    Windows XP Professional     11/10/2011 8:25:46 PM   3/13/2012 7:49:25 PM    3/11/2012 12:00:03 PM   3/13/2012 12:00:00 AM   tim.erny    My Company\AHRQ\eCOPY-machines  16X.XX.XX.XX    Desktop |network scanners|fisma-mgmt|desktops|fisma-all|

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Во-первых, ответ: вы можете использовать функцию RANK в качестве подзапроса, как предложено выше в виде медвежьего комментария (CTE здесь не нужен, за исключением того, что, может быть, все хорошо)

(SELECT PatternID, RANK() OVER (ORDER BY Version DESC) AS Ranking) AS RankTbl
WHERE Ranking > 1

RANK присваивает одинаковые ранги одинаковым версиям (что звучит как то, что вы хотите), но если вы хотите получить уникальный ранг для каждой записи версии, вам нужно будет использовать ROW_NUMBER()

Однако, это будет работать только в том случае, если вы запустите какой-то SUBSTRING, который выберет ревизию из даты, чтобы он мог выполнить заказ должным образом. Однако создание более нормализованной базы данных облегчит эту задачу (см. Ниже)

Во-вторых, некоторые примечания:

  • Вам не нужны двойные кавычки вокруг каждой части вашего запроса. Это просто делает код менее читабельным. Если вы должны использовать разграничение, то используйте квадратные скобки []
  • Если можете, удалите ревизию с даты в версии. Это позволит вам приблизиться к обычной базе данных и отсортировать ваши версии без каких-либо манипуляций со строками

Это только мои мысли о вышесказанном ...

0 голосов
/ 13 марта 2012

Используйте функцию RANK в CTE , используя ORDER BY для сортировки номеров ревизий в порядке убывания.Затем выберите из CTE, где RANK значение больше 1.

См. Пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...