LINUX.ORG.RU

Запрос статистики

 ,


0

1

Помогите с запросом:

BEGIN;

PRAGMA temp_store = 2;

CREATE TEMP TABLE _Status_avgs (placeid INT PRIMARY KEY, status_avg REAL);

-- Временная таблица для средних состояний по позициям
-- Вместо этого тупо считает среднее состояние всех элементов
INSERT INTO _Status_avgs(placeid, status_avg)
  SELECT places.id, avg(items.status)
    FROM places
    INNER JOIN items
          ON items.placeid = places.id;

.mode column
.header on

-- Нужна таблица всех элементов, сотсояние которых выше среднего по их
-- позициям
SELECT items.id, items.status, places.name
  FROM items
  INNER JOIN places
        ON places.id = items.placeid
  WHERE items.status >= (SELECT _Status_avgs.status_avg FROM _Status_avgs
                           WHERE _Status_avgs.placeid = places.id); 

DROP TABLE _Status_avgs;
END;
★★★★★

возм ЯННП, но вроде так

вместо этого

WHERE items.status >= (SELECT _Status_avgs.status_avg FROM _Status_avgs
WHERE _Status_avgs.placeid = places.id);

нужно следующее

INNER JOIN items ON items.placeid = _Status_avgs.placeid
WHERE items.status >= _Status_avgs.status_avg;

ZuBB ★★★★★ ()
Последнее исправление: ZuBB (всего исправлений: 1 )
Ответ на: комментарий от ZuBB

Не работает. Я считаю проблема здесь:

SELECT places.id, avg(items.status)
    FROM places
    INNER JOIN items
          ON items.placeid = places.id;

При запросе его к базе у которой вот этот дамп, получается вот это:

$ cat test.sql|sqlite3 -batch test.sqlite 
id          avg(items.status)
----------  -----------------
4           8.81428571428571

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

ados ★★★★★ ()
Последнее исправление: ados (всего исправлений: 1 )
Ответ на: комментарий от ados

Такой код в результате:

BEGIN;

PRAGMA temp_store = 2;

.mode column
.header on 

CREATE TEMP TABLE _Status_avgs (placeid INT PRIMARY KEY, status_avg REAL);

INSERT INTO _Status_avgs(placeid, status_avg)
  SELECT places.id, avg(items.status)
    FROM places 
    INNER JOIN items
          ON items.placeid = places.id
    GROUP BY places.id; 

SELECT items.id, items.status, places.name
  FROM items
  INNER JOIN places
        ON places.id = items.placeid
  INNER JOIN _Status_avgs
        ON items.placeid = _Status_avgs.placeid
  WHERE items.status >= _Status_avgs.status_avg;

DROP TABLE _Status_avgs;
END;
ados ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.