【问题标题】:SQL Derby return middle of tableSQL Derby 返回表的中间
【发布时间】:2013-11-21 19:47:49
【问题描述】:

假设我有一张看起来像这样的表

COL1
1
1
1
2
2
3
3
3
3
4
5
5
6
6
7
7

其他一些对此问题不重要的列。如果我想从 4 返回除前两个值之外的所有值,我将如何使用 derby 执行此操作?

这是清除我想要的预期输出

COL1
3
3
3
3
4
5
5
6
6

感谢您的帮助,我在 SQL 方面不是最好的,但我正在尝试:)

【问题讨论】:

    标签: sql derby


    【解决方案1】:

    试试这个...

    SELECT t.*
    FROM mytab t
    INNER JOIN (SELECT MIN(COL1) AS VAL2
                FROM mytab
                WHERE COL1 NOT IN (SELECT MIN(COL1) FROM mytab)) x
    ON t.COL1 > x.VAL2
    

    工作示例 http://www.datagloop.com/?USERNAME=DATAGLOOP/SO_DERBY&ACTION=LOGIN

    【讨论】:

    • 太棒了,谢谢。你能帮我弄清楚如何在同一个查询中删除最后两个吗?
    【解决方案2】:

    这是一个使用临时表的解决方案,它具有更大的灵活性和可读性,还可以让您更好地调整参数。

    查询的 ROWID 部分是您的位置参考。

    CREATE TEMP TABLE mycol_order
        (COL1       INTEGER NOT NULL,
         TOTAL_COLS INTEGER NOT NULL,
        PRIMARY KEY (COL1));
    
    INSERT INTO mycol_order
            (COL1,TOTAL_COLS)
    SELECT DISTINCT t1.COL1,
            t2.total
    FROM        mytab t1,
            (SELECT COUNT(DISTINCT COL1) AS total FROM mytab) t2
    ORDER BY    1;
    
    
    SELECT  t.*
    FROM    mytab t
        INNER JOIN mycol_order co
            ON co.col1 = t.col1
            AND co.ROWID > 2
            AND co.ROWID < co.total_cols;
    

    还更新了工作示例 http://www.datagloop.com/?USERNAME=DATAGLOOP/SO_DERBY&ACTION=LOGIN的工作示例

    【讨论】:

    • PS:我上面的版本是针对 SQLITE 的。不知道 Derby,但如果它有一个 ROW_NUMBER() 类型的函数,你可以使用它而不是使用临时表,但是查询的基本逻辑是一样的
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2017-01-26
    • 2011-01-05
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多