比较两个数字 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 位数字并给出输出
在 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 位数字并给出输出