【问题标题】:SQL query for distinct values不同值的 SQL 查询
【发布时间】:2010-11-13 07:00:59
【问题描述】:

我有一张如下表

INTERPRO    GOTERM1  GOTERM2   CONFIDENCE

IPR123      1576     2345       1.000
IPR235      3459     4987       1.000
IPR356      9987     5567       1.000
IPR568      3345     3213       0.88
IPR342      7860     7654       0.88 

现在我想要任何具有不同置信度值的记录,如下所示

IPR123   1576    2345   1.000
IPR342   7860    7654    0.88

【问题讨论】:

  • 好吧,IPR123 1576 2345 1.000,为什么不IPR235 3459 4987 1.000?定义额外的标准来决定选择哪一行。
  • 采用具有不同置信度值的任何行。没有特定标准。

标签: sql sql-server tsql distinct


【解决方案1】:

使用 Sql Server 2005+ 你可以尝试类似的东西

;WITH Vals AS(
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY CONFIDENCE ORDER BY INTERPRO ) RowID
        FROM    YourTable
)
SELECT  *
FROM    Vals
WHERE   RowID = 1

ROW_NUMBER (Transact-SQL)

【讨论】:

    【解决方案2】:
    SELECT t.INTERPRO, t.GOTERM1, t.GOTERM2, t.CONFIDENCE
    FROM   tbl t
    WHERE  t.INTERPRO = (SELECT MIN(t2.INTERPRO)
                         FROM   tbl t2
                         WHERE  t.CONFIDENCE = t2.CONFIDENCE)
    

    编辑:

    如果 INTERPRO 是非唯一性的:

    SELECT t2.INTERPRO, t2.GOTERM1, t2.GOTERM2, t1.CONFIDENCE
    FROM   (SELECT DISTINCT t3.CONFIDENCE FROM tbl t3) t1,
           (SELECT TOP 1 t4.INTERPRO, t4.GOTERM1, t4.GOTERM2
            FROM   tbl t4
            WHERE  t4.CONFIDENCE = t1.CONFIDENCE) t2
    

    应该可以,虽然我目前没有方便的 SQL Server 实例来仔细检查。

    【讨论】:

    • 如果有 2 行具有相同的 t.INTERPRO 怎么办?
    • 我发帖离开电脑过夜后才想到这一点。如果根据 CONFIDENCE INTERPRO 不是唯一的,那么这将不起作用,所以是时候进行编辑了...
    【解决方案3】:

    如果 INTERPRO 是唯一的

    SELECT * FROM TABLE WHERE INTERPRO in 
    (
    SELECT MIN(INTERPRO) FROM TABLE
    GROUP BY CONFIDENCE
    )  
    

    你可以用你喜欢的任何东西替换 MIN()

    【讨论】:

    • 这个查询会给出不一致的数据
    • 正如 user489678 所说:采用具有不同置信度值的任何行。没有特定的标准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多