У меня сложный запрос, который действительно над моей головой. Я думаю, что RANK of RANK-ing нужен, но должен быть лучший и существующий способ.Комплекс RANK в SQL
Здесь у меня есть SimPE таблица:
Manufacturer DateOF Status Prefer
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerUninstalled 70
Dell 05-2014 ComputerUninstalled 70
Dell 05-2014 ComputerUninstalled 70
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerUninstalled 70
Dell 05-2014 ComputerNew 26
Dell 05-2014 ComputerNew 26
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerInstalled 30
Что мне нужно сделать, это GROUP BY таблицы по ПРОИЗВОДИТЕЛЮ и DATEOF колонн, затем выбрать строки с самым низким ПРЕДПОЧИТАЛИ число (26 в этом случае).
Ее легко с помощью функции RANK:
SELECT sq.*
FROM
(
SELECT
*,
RANK() OVER (PARTITION BY Manufacturer,DateOF ORDER BY Prefer) AS RankPrefer
FROM
table1
WHERE
RankPrefer = 1
) sq
Так что я буду иметь результат 2 ряда с Status ComputerNew.
Manufacturer DateOF Status Prefer
Dell 05-2014 ComputerNew 26
Dell 05-2014 ComputerNew 26
Это легко, а не вопрос.
Вопрос заключается в том:
Я должен реализовать следующее правило:
Если строки с наименьшим Предпочитают значения (например: 26) оказываются иметь ComputerNew значение в их Состояние поле, , тогда я должен добавить больше строк с ComputerInstalled значений.
Результат должен быть таким:
Manufacturer DateOF Status Prefer
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerNew 26
Dell 05-2014 ComputerNew 26
Dell 05-2014 ComputerInstalled 30
Dell 05-2014 ComputerInstalled 30
Подобно этому правилу, у меня есть еще одно:
Если строки с наименьшим Предпочитают значения (например: 26) оказываются имеют ComputerOld значение в их Состояние поле, тогда я должен включить больше строк с ComputerUninstalled val ЕЭС.
Я думаю, что RANK of RANKING разрешит это, но теперь я действительно потерян.
Любая помощь приветствуется в этой загадке.
Спасибо
edit1:
решение Гордона почти хорошо, но не идеально.
Я даю вам больше тестовых данных, там вы можете увидеть, где они терпят неудачу. SQLFiddle для тестирования: here.
I включают тестовые данные и здесь:
INSERT Table1 VALUES ('HP10011','04/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP10011','04/04/2014','ComputerOld',26)
INSERT Table1 VALUES ('HP10011','04/04/2014','ComputerOld',26)
INSERT Table1 VALUES ('HP10011','04/30/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP10011','05/23/2014','QuickDispose',10)
INSERT Table1 VALUES ('HP10011','06/03/2014','QuickDispose',10)
INSERT Table1 VALUES ('HP10077','04/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP1910','04/25/2014','QuickDispose',10)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP1910','05/01/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP1910','05/02/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP1910','05/02/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','05/07/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','05/08/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/08/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/08/2014','ComputerInstalled',30)
INSERT Table1 VALUES ('HP3720','05/08/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/06/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/06/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/10/2014','ComputerOld',26)
INSERT Table1 VALUES ('HP3720','06/10/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/10/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/11/2014','ComputerOld',26)
INSERT Table1 VALUES ('HP3720','06/11/2014','ComputerUninstalled',70)
INSERT Table1 VALUES ('HP3720','06/11/2014','ComputerUninstalled',70)
Запрос возвращает обе строки ComputerInstalled и ComputerUninstalled для следующих данных:
'HP1910','05/01/2014','ComputerInstalled',30
'HP1910','05/01/2014','ComputerUninstalled',70
Он должен выбрать ComputerInstalled только потому, что Производитель, в том же месяце, он должен выбрать самый низкий вариант (30).
Результат для этого набора данных должен быть таким:
Manufacturer DateOF Status Prefer
HP10011 2014-04-01 ComputerUninstalled 70
HP10011 2014-04-04 ComputerOld 26
HP10011 2014-04-04 ComputerOld 26
HP10011 2014-04-30 ComputerUninstalled 70
HP10011 2014-05-23 QuickDispose 10
HP10011 2014-06-03 QuickDispose 10
HP10077 2014-04-01 ComputerUninstalled 70
HP1910 2014-04-25 QuickDispose 10
HP1910 2014-05-01 ComputerInstalled 30
HP1910 2014-05-01 ComputerInstalled 30
HP1910 2014-05-01 ComputerInstalled 30
HP1910 2014-05-01 ComputerInstalled 30
HP3720 2014-05-07 ComputerInstalled 30
HP3720 2014-05-07 ComputerInstalled 30
HP3720 2014-05-08 ComputerInstalled 30
HP3720 2014-05-08 ComputerInstalled 30
HP3720 2014-05-08 ComputerInstalled 30
HP3720 2014-06-06 ComputerUninstalled 70
HP3720 2014-06-06 ComputerUninstalled 70
HP3720 2014-06-10 ComputerOld 26
HP3720 2014-06-10 ComputerUninstalled 70
HP3720 2014-06-10 ComputerUninstalled 70
HP3720 2014-06-11 ComputerOld 26
HP3720 2014-06-11 ComputerUninstalled 70
HP3720 2014-06-11 ComputerUninstalled 70
Вы пишете, вам нужно добавить больше строк. Но на основании какого условия? Нужно ли включать следующие строки, где значение «Предпочтительность» является вторым, большим, чем самое низкое, и «Состояние» = «Установленные компьютером»? – derstauner
Ниже приведены ответы @derstauner. Так что больше строк вставляется только в двух случаях: 1. Когда строки с наименьшим Предположим, что в поле «Статус» есть «ComputerOld» (затем включить строки с «ComputerUninstalled» в поле «Статус»). 2. Такая же логика, но с компьютерами ComputerNew и ComputerInstalled calues. – Avithohol