Выбрать все элементы с суммой полей в указанном диапазоне - PullRequest
4 голосов
/ 28 декабря 2011

У меня есть простая таблица:

file_size file_id file_time  
   1        1         19  
   2        2         20  
   3        3         21  
   4        4         22  
   5        5         23

Я хочу найти такой элемент, чтобы все элементы с меньшим значением file_time имели сумму file_size в предопределенном диапазоне.Я написал следующий запрос:

SELECT * FROM test_table AS D0 WHERE 
(SELECT TOTAL(file_size) FROM test_table AS D1 WHERE
D1.file_time <= D0.file_time ORDER BY file_id)
BETWEEN 1 AND 9

Этот запрос дает правильные результаты:

   1        1         19  
   2        2         20  
   3        3         21

Но этот запрос не работает, если необходимые элементы имеют то же поле file_time:

file_size file_id file_time  
   1        1         20  
   2        2         20  
   3        3         20  
   4        4         20  
   5        5         20  

Желаемый результат для этих данных:

   1        1         20  
   2        2         20  
   3        3         20  

Поле file_id уникально.Что не так в моем SQL-запросе?

Код для создания тестовой таблицы:

CREATE TABLE test_table (file_size INT, file_id INT, file_time INT)
INSERT INTO test_table VALUES(1,1,20)
INSERT INTO test_table VALUES(2,2,20)
INSERT INTO test_table VALUES(3,3,20)
INSERT INTO test_table VALUES(4,4,20)
INSERT INTO test_table VALUES(5,5,20)

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Не следует рассматривать file_time как один столбец в запросе, так как вы также хотите рассмотреть столбец file_id.Вы должны использовать пары file_time и file_id и сравнить их лексикографически следующим образом:

SELECT * 
FROM test_table AS D0
WHERE (

  SELECT TOTAL( file_size ) 
  FROM test_table AS D1
  WHERE D1.file_time < D0.file_time
  OR (
    D1.file_time = D0.file_time
    AND D1.file_id <= D0.file_id
  )
  ORDER BY file_time, file_id DESC
)
BETWEEN 1 
AND 9
0 голосов
/ 28 декабря 2011

Не уверен, что понял, но думаю

-- sum of file sizes between 1 and 7 with the lowest time
SELECT SUM(test.file_size) AS sum_file_size, test.file_time
 FROM test
 WHERE (test.file_time = (SELECT TOP 1 test.file_time 
                           FROM test 
                           ORDER BY file_time))
 AND (test.file_size BETWEEN 1 AND 9)
 GROUP BY test.file_time;

-- sum of file sizes per time `group`
SELECT SUM(test.file_size) AS sum_file_size, test.file_time,
 FROM test
 WHERE (test.file_size BETWEEN 1 AND 7)
 GROUP BY test.file_time
 ORDER BY test.file_time;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...