SQL使用" first 1"进行选择和分组。

时间:2017-06-04 07:07:24

标签: sql firebird greatest-n-per-group firebird1.5

尽管标题令人困惑,但我认为这很简单 我有一个以下格式的数据库: (实施例)

---------------------------------
| 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。

3 个答案:

答案 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