比较两个数字 SQL

Compare two number SQL

在 SQL 中,我试图比较同一字段中的两个数字。这两个数字包含不同的信息,但由于某些技术原因,它们是相同的。问题是当存在一个长度为 5 的子串和另一个长度为 4 的子串并且两者的最后 4 位数字都是 same.I 想要得到第一个长度为 5.

示例:

--------------------------------
|ID | Number| Description        |
---------------------------------
| 1 | 12345 | Project X,Ready    |
---------------------------------
| 2 |  2345 | Project X,onDesign |
---------------------------------   

如果存在最后 ​​4 位数字相同的数字,我应该总是得到 12345(或最大的一个)。是否有任何 CASE 或 CTE 声明可以让我轻松解决此问题?

所以您需要使用最后 4 位数字加入。您可以使用简单的 MOD 运算符来完成此操作。它在 SQL 服务器中用作百分号。

SELECT 12345 % 10000;

这输出 2345。正是我们要找的。

因此我们可以构建以下查询来使用该计算:

DECLARE @Test TABLE
(
    ID INT
    , Number INT
    , Description VARCHAR(500)
);

INSERT INTO @Test(ID, Number, Description)
VALUES (1, 12345, 'Project X,Ready')
    , (2, 2345, 'Project X,onDesign');

SELECT T1.*
FROM @Test AS T1
INNER JOIN @Test AS T2
    ON T2.Number = T1.Number % 10000
WHERE T2.Number <> T1.Number;

输出:

╔════╦════════╦═════════════════╗
║ ID ║ Number ║   Description   ║
╠════╬════════╬═════════════════╣
║  1 ║  12345 ║ Project X,Ready ║
╚════╩════════╩═════════════════╝

请注意,我添加了 WHERE T2.Number <> T1.Number。它消除了相等的数字,因为 SELECT 2345 % 10000 也是 2345

更新

这可以使用 ROW_NUMBER()

来完成
;WITH Data (ID, Number, Description, RN)
AS (
    SELECT ID
        , Number
        , Description
        , ROW_NUMBER() OVER (PARTITION BY Number % 10000 ORDER BY Number DESC)
    FROM @Test
    )
SELECT *
FROM Data
WHERE RN = 1;

这将执行经典的 row_number 操作。它会将 windows 划分为 Number % 10000,这意味着 12345 和 2345 将属于相同的 window,并且最大的数字将始终排在第一位。

试试这个:

SELECT Id
,Number
,Description
FROM (
SELECT Id
    ,Number
    ,Description
    ,rank() OVER (PARTITION BY right(cast([Number] AS VARCHAR(20)), 4) ORDER BY Number DESC) AS Ranking
FROM YourTable
) InnerTable
WHERE ranking = 1

查询可能特定于 RDBMS。例如,对于 MSSQL,您可以这样做:

SELECT  *
FROM    myTable AS d1
WHERE   NOT EXISTS ( SELECT *
                     FROM   myTable AS d2
                     WHERE  SUBSTRING(d2.number, 2, 4) = d1.number );

编辑:啊,你编辑了,它是一个 INT!然后你可以使用 % 运算符而不是子字符串。

CTE 示例:

DECLARE @dummy TABLE
  (
    id INT IDENTITY
           PRIMARY KEY ,
    number INT ,
    [description] VARCHAR(20)
  );

INSERT  @dummy ( [number], [description] )
VALUES  ( 12345, 'P' ),
        ( 22345, 'P' ),
        ( 2345, 'P' ),
        ( 3456, 'P' ),
        ( 13456, 'P' ),
        ( 4567, 'P' );

WITH  d AS (
             SELECT MAX(number) AS maxNum
             FROM   @dummy AS [d]
             GROUP BY [d].[number] % 10000
           )
  SELECT  d1.*
  FROM    @dummy AS [d1]
  INNER JOIN d ON d.[maxNum] = d1.[number];

这里有一个 not exists 的例子:

DECLARE @t TABLE
    (
      ID INT ,
      Number INT ,
      Description VARCHAR(100)
    )

INSERT  INTO @t
VALUES  ( 1, 12345, 'Project 1' ),
        ( 2, 2345, 'Project 2' ),
        ( 3, 77777, 'Project 3' ),
        ( 4, 7777, 'Project 4' ),
        ( 5, 88888, 'Project 5' ),
        ( 6, 9999, 'Project 6' )

SELECT * FROM @t t1
WHERE NOT EXISTS(SELECT * FROM @t t2 
                 WHERE t2.ID <> t1.ID AND 
                 CAST(t2.Number AS VARCHAR(10)) LIKE '%' + CAST(t1.Number AS VARCHAR(10)))

输出:

ID  Number  Description
1   12345   Project 1
3   77777   Project 3
5   88888   Project 5
6   9999    Project 6

试试这个:

SELECT DISTINCT A.*
FROM [Tablename] AS A
INNER JOIN [Tablename] AS B
ON B.Number =RIGHT(A.Number,4)
WHERE B.Number <> A.Number;

RIGHT(A.Number,4) 将比较最后 4 位数字并给出输出