【问题标题】:Oracle SQL: Select ALL rows by each of their most recent ID columnOracle SQL:按每个最近的 ID 列选择所有行
【发布时间】:2017-08-28 11:45:52
【问题描述】:

这可能很容易解决,但我似乎无法正确地用谷歌搜索找到答案。

我希望通过最近的 ID 从表中提取所有行,而无需手动输入每个列名。我已经在使用以下查询:

SELECT 
 STANDARD_ID,
 MAX(ID)

FROM
 HIST_ILLUM_RT

WHERE STANDARD_ID IS NOT NULL

GROUP BY 
 STANDARD_ID

这会拉出我需要的所有行。我试图通过使用这个查询来解决这个问题:

SELECT 
*

FROM
 HIST_ILLUM_RT

WHERE ID = (SELECT MAX(ID)
            FROM HIST_ILLUM_RT)

获取所有列但仅获取一行。例如

应该被拉取的行数会随着时间的推移而改变。

是否可以在不手动输入每个列名的情况下提取所有列和行(在这种情况下超过 50 个)?还是别无选择,只能在Oracle sql中手动输入?

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:

    将您自己的查询与 GROUP BY 一起使用怎么样?

    SELECT *
    FROM HIST_ILLUM_RT
    WHERE ID IN (
        SELECT MAX(ID)
        FROM HIST_ILLUM_RT GROUP BY STANDARD_ID
    )
    

    【讨论】:

    • 嗯.. 没想到这样做似乎是个好主意。然而,这个似乎只是在做 SELECT *FROM HIST_ILLUM_RT 但它可能会起作用。我会继续看谢谢!
    • 等等!我错了。它可能真的有效,让我仔细检查一下。
    【解决方案2】:

    试试这个:

    WITH CTE AS(
    
           SELECT  STANDARD_ID,ID,
                   ROW_NUMBER() OVER(Partition BY ID ORDER BY ID DESC) RN
           FROM HIST_ILLUM_RT
           WHERE STANDARD_ID IS NOT NULL
    )
    SELECT STANDARD_ID,ID
    FROM CTE 
    WHERE RN = 1;
    

    【讨论】:

    • 感谢您的回复!这在没有';'的情况下有效但它仍然只选择那两列。我正在尝试选择 50-ish 列而无需手动输入它们,除非这是不可避免的
    • 如果您不想同时选择行号(通过select *),那么您别无选择,只能列出列。
    • 啊,好吧。所以我希望以此创建一个视图,但行号可能会发生变化,所以我会尝试勇敢地写出它们中的每一个。
    • 也感谢 JaydipJ!我以前没有听说过 CTE,查找它们似乎很有用!
    猜你喜欢
    • 2018-06-12
    • 2012-07-11
    • 2017-11-06
    • 1970-01-01
    • 2020-05-29
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多