在SQL中,我试图比较同一字段中的两个数字。两个数字都包含不同的信息,但由于某些技术原因,它们是相同的。问题是当存在一个长度为5的子字符串和另一个长度为4的子字符串且两者的最后4位数字相同时。我想获得长度为5的第一个字符串。
示例:
--------------------------------
|ID | Number| Description |
---------------------------------
| 1 | 12345 | Project X,Ready |
---------------------------------
| 2 | 2345 | Project X,onDesign |
---------------------------------
如果存在最后4位相同的数字,我应该总是得到12345(或最大的一个)。是否有任何CASE或CTE声明可以让我轻松解决这个问题?
答案 0 :(得分:3)
试试这个:
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
答案 1 :(得分:0)
所以你需要使用最后4位数加入。您可以使用简单的MOD
运算符来完成此操作。它在SQL Server中用作百分号。
SELECT 12345 % 10000;
这会输出2345
。正是我们正在寻找的。 p>
因此我们可以构建以下查询以使用该计算:
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。它将按Number % 10000
对窗口进行分区,这意味着12345和2345将落在同一窗口下,并且最高的数字将始终位于第一位。
答案 2 :(得分:0)
查询可能是RDBMS特定的。例如,对于MSSQL,你可以这样做:
'port' => 26,
编辑:啊,你编辑了,这是一个INT!然后你可以使用%运算符而不是substring。
CTE示例:
SELECT *
FROM myTable AS d1
WHERE NOT EXISTS ( SELECT *
FROM myTable AS d2
WHERE SUBSTRING(d2.number, 2, 4) = d1.number );
答案 3 :(得分:0)
以下是public class MainViewModel
{
//INPC omitted for brevity
public object CurrentViewModel { get; private set; }
public void MainViewModel()
{
this.CurrentViewModel = new LoginViewModel(LoginComplete);
}
private void LoginComplete()
{
this.CurrentViewModel = new NavigationViewModel();
}
}
public class LoginViewModel
{
private Action loginCompleteAction;
public void LoginViewModel(Action loginCompleteAction)
{
this.loginCompleteAction = loginCompleteAction;
}
private void UserHasLoggedIn()
{
this.loginCompleteAction();
}
}
的示例:
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)))
答案 4 :(得分:0)
试试这个:
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位数字并给出输出