Мутный запрос

SwordeR
Дата: 29.11.2006 18:30:51
Нужно реализовать только средствами SQL (даже Jet SQL). Не силен в SQL, скажу сразу. Но как реализовать это даже не знаю.
Есть таблица, например:
id field_a field_b field_c
1 4 3 2
2 6 2 7
3 7 5 1
4 8 5 9
5 3 7 6
Нужно, чтобы выбрало по field_а все значения с разбросом 2 (например), т.е. должно выбрать 2 диапазона 4-6 и 6-8, в который попадают соответственно значения из field_a: 4, 6, 7, 8.
Далее ищется у кого из отобранных самый большой field_b (в данном примере - field_b 5), потом - field_c (в примере 9).
Остается одна результирующая строка.
id field_a field_b field_c
4 8 5 9
Поля все int, ключ id
Если нельзя/сильно муторно одним запросом, подскажите как логичнее разбить на несколько.
DiDis
Дата: 29.11.2006 18:46:19
может у вас пример построен плохо но разве результирующая строка не есть max(field_b) ?
я не понимаю для чего разбивать чтоб потом найти из них у кого больше?
Karfaqen
Дата: 29.11.2006 20:10:45
SwordeR
Далее ищется у кого из отобранных самый большой field_b (в данном примере - field_b 5), потом - field_c (в примере 9).
Красное - это на случай, если после поиска максимума по field_b получится больше одной записи - и тогда среди них уже выбирать запись с максимальным значением field_c, да? А какую запись брать, если и с максимумом field_c тоже будет несколько записей? Любую? Или все? Уточняйте.
Karfaqen
Дата: 29.11.2006 20:49:35
Вот вариант с 4-мя поэтапными запросами (исходно - таблица t1 с полями id,a,b,c)
---
[q1] список интервалов по полю [a], значения с разбросом 2 (a1 - начало интервала, a2 - конец интервала)
SELECT DISTINCT t1.a AS a1, t2.a AS a2 FROM t1 INNER JOIN t1 AS t2 ON t1.a=t2.a-2

[q2] список исходных записей, попадающих в интервалы выбранные запросом q1
SELECT DISTINCT id,a,b,c FROM q1 INNER JOIN t1 ON  t1.a>=q1.a1 AND t1.a<=q1.a2

[q3] выбор записей запроса q2 с максимальным значением в поле b
SELECT id,a,b,c FROM q2 WHERE b=(SELECT MAX(b) FROM q2)

[q4] выбор записей запроса q3 с максимальным значением в поле c
SELECT id,a,b,c FROM q3 WHERE c=(SELECT MAX(c) FROM q3)
---
Если на выходе требуется одна (любая) запись, добавить в запрос q4 TOP 1
Karfaqen
Дата: 29.11.2006 20:54:07
Вдогонку.
В принципе, все это можно объединить в один запрос.
Но в нем бы я запарился объяснять вам, что к чему ;)
Пробуйте, вобщем.
SwordeR
Дата: 29.11.2006 21:07:56
Karfaqen
Вот вариант с 4-мя поэтапными запросами (исходно - таблица t1 с полями id,a,b,c)


Похоже проще будет вот так поэтапно, идею уловил. Буду пробовать.
Спасибо всем, кто ответил.