SQL умножает выбор и группировку, используя "первый 1"
Несмотря на запутанный заголовок, я думаю, что это довольно просто, у меня есть база данных в следующем формате: (ПРИМЕР)
---------------------------------
| X101| X102 | X103 | X104 |
---------------------------------
| COD | PROD_NAME | TYPE | INFO |
| 05 | PROD A1 | 05 | ABC |
| 019 | TAPE 01 | 05 | ABC |
| 052 | MASTER 0 | 03 | ABC |
| 111 | APPLE | 03 | ABC |
| 150 | RANDOM0 | 05 | ABC |
| 235 | ITEM661 | 03 | ABC |
| 290 | ITEM874 | 03 | ABC |
---------------------------------
Я пытался во многих отношениях, но я не дал результата. База данных насчитывает чуть более 20 тысяч товаров, я хотел знать, как "выбрать первые 1" каждого ТИПА ("группировать по ТИПУ" и показывать только "первую 1" каждого типа)
База данных Firebird 1.5.
3 ответа
Первый, в каком порядке, в частности?
WITH TYPES AS
(
SELECT TYPE, COUNT(*) AS 'COUNT' FROM EXAMPLE GROUP BY TYPE
)
SELECT
TYPE,
(SELECT TOP 1 PROD_NAME FROM EXAMPLE e WHERE e.TYPE = t.TYPE ORDER BY COD ASC) AS 'FIRST',
COUNT
FROM TYPES t
Это приводит к следующему:
TYPE | FIRST | COUNT
-----|----------|------
03 | MASTER 0 | 4
05 | TAPE 01 | 3
Это то, что вы после?
Можно использовать хранимые процедуры.
CREATE PROCEDURE SelectFirstOfTypes()
RETURNS (COD INT, PROD_NAME VARCHAR(15), TYPE INT, INFO VARCHAR(15)) AS
BEGIN
FOR SELECT DISTINCT TYPE FROM EXAMPLE INTO :TYPE DO BEGIN
FOR SELECT FIRST 1 e.COD, e.PROD_NAME, e.INFO FROM EXAMPLE e
WHERE :TYPE = e.TYPE INTO :COD, :PROD_NAME, :INFO DO BEGIN
SUSPEND;
END
END
END;
GRANT SELECT ON EXAMPLE TO SelectFirstOfTypes;
SELECT * FROM SelectFirstOfTypes();
Обратите внимание, что оба SELECT
операторы заключены в цикл FOR.
- внешний - потому что он может вернуть несколько строк,
- внутренний - потому что он может вернуть ноль строк для определенных типов
Некоторые ссылки
Если у вас нет условий для "первого 1", вы можете просто попробовать.
SELECT * FROM yourTable GROUP BY TYPE