尽管标题令人困惑,但我认为这很简单 我有一个以下格式的数据库: (实施例)
---------------------------------
| 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 |
---------------------------------
我在很多方面都尝试过,但我没有想出结果。数据库有2万多个产品,我想知道如何 '选择第一个'每个类型(按类型'分组,并且仅显示每种类型的'前1')
数据库是Firebird 1.5。
答案 0 :(得分:0)
第一个是什么顺序,特别是?
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
这就是你要追求的?
答案 1 :(得分:0)
可以使用存储过程。
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循环中。
一些链接
答案 2 :(得分:-2)
如果您没有任何条件,那么第一个"第一个"你可以试试。
SELECT * FROM yourTable GROUP BY TYPE