Sql server SQL:仅返回多个最早的记录

Sql server SQL:仅返回多个最早的记录,sql-server,Sql Server,我试图使用一点复杂的sql返回一个字符串,但我就是无法基于与最新的D.CreateDateTime相同的电话号码返回它 Source CallData Phonenum FK_REF D.createdatetime Source 1 609 ^Mr Richard Smith^01234567891^ 01234567891 27657 16/06/2014 Source2 1 609 ^Mr Richard

我试图使用一点复杂的sql返回一个字符串,但我就是无法基于与最新的D.CreateDateTime相同的电话号码返回它

Source           CallData                       Phonenum    FK_REF  D.createdatetime
Source   1 609 ^Mr Richard Smith^01234567891^   01234567891 27657   16/06/2014
Source2  1 609 ^Mr Richard Smith^01234567891^   01234567891 27657   21/07/2014
Source3  1 609 ^Mr Richard Smith^01234567891^   01234567891 27657   03/10/2014
预期结果

    Source           CallData                       Phonenum    FK_REF  D.createdatetime
    Source3  1 609 ^Mr Richard Smith^01234567891^   01234567891 27657   03/10/2014
然而,我似乎找不到一种有效的方法,因为我试图使用

不起作用,或者更确切地说,我找不到将所述数据插入查询的位置

如果有人能够理解(有点复杂的)sql查询并提供足够的帮助,那将是不可思议的

多谢各位

代码如下

--Create Table #tmp2(FK_clientids varchar(50))
--Create table #tmp (phonenums varchar(50))
Delete from #tmp2
Delete from #tmp
Use DavikerTWF_MTA
INSERT INTO #tmp2
SELECT fk_clientid
FROM DM_ClientApplicants
where FK_ApplicationID in (--FK_ApplicationID goes here)

Use DavikerTWF_OTS
INSERT INTO #tmp
Select phonenum2 from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
INSERT INTO #tmp
Select PhoneNum1 from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
INSERT INTO #tmp
Select PhoneNum2 from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)

INSERT INTO #tmp
Select PhoneNum3 from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
INSERT INTO #tmp
Select Partnerphonehome from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
INSERT INTO #tmp
Select Partnerphonemobile from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
INSERT INTO #tmp
Select Partnerphonework from DM_PhoneNumbers
where FK_ApplicationID in 
(
   Select FK_clientIDs from #tmp2
)
Use TouchStar
Select sourcetable,CallData,PhoneNum,DM_PhoneNumbers.FK_ApplicationID,d.CreateDateTime from Dial D
join DavikerTWF_OTS.dbo.DM_PhoneNumbers on PhoneNum= PhoneNum1
Collate latin1_general_CI_AS
where PhoneNum in
(
Select phonenums from #tmp
)

试试这样的

;WITH CTE AS 
(SELECT *
      ,ROW_NUMBER() OVER (PARTITION BY Phonenum ORDER BY
              CAST(RIGHT(createdatetime ,4)+SUBSTRING(createdatetime, 4,2)+LEFT(createdatetime ,2) 
                   AS DATETIME) DESC) rn
FROM TableName   
)
SELECT * FROM CTE 
WHERE rn = 1

试试这样的

;WITH CTE AS 
(SELECT *
      ,ROW_NUMBER() OVER (PARTITION BY Phonenum ORDER BY
              CAST(RIGHT(createdatetime ,4)+SUBSTRING(createdatetime, 4,2)+LEFT(createdatetime ,2) 
                   AS DATETIME) DESC) rn
FROM TableName   
)
SELECT * FROM CTE 
WHERE rn = 1

试试这样的

;WITH CTE AS 
(SELECT *
      ,ROW_NUMBER() OVER (PARTITION BY Phonenum ORDER BY
              CAST(RIGHT(createdatetime ,4)+SUBSTRING(createdatetime, 4,2)+LEFT(createdatetime ,2) 
                   AS DATETIME) DESC) rn
FROM TableName   
)
SELECT * FROM CTE 
WHERE rn = 1

试试这样的

;WITH CTE AS 
(SELECT *
      ,ROW_NUMBER() OVER (PARTITION BY Phonenum ORDER BY
              CAST(RIGHT(createdatetime ,4)+SUBSTRING(createdatetime, 4,2)+LEFT(createdatetime ,2) 
                   AS DATETIME) DESC) rn
FROM TableName   
)
SELECT * FROM CTE 
WHERE rn = 1

有几种方法可以做到这一点。我经常这样做的方式是使用row_number函数对按您感兴趣的键划分的行进行排序,然后只选择最上面的一个。像这样:

select sourcetable,CallData,PhoneNum,FK_ApplicationID,CreateDateTime
from
(
    Select sourcetable,CallData,PhoneNum,DM_PhoneNumbers.FK_ApplicationID,d.CreateDateTime, ROW_NUMBER() Over (Partition by PhoneNum order by d.CreateDateTime desc) rownum
    from Dial D
    join DavikerTWF_OTS.dbo.DM_PhoneNumbers 
    on PhoneNum= PhoneNum1 Collate latin1_general_CI_AS
    where PhoneNum in
        (
        Select phonenums from #tmp
        )
) AllRows
where rownum = 1

有几种方法可以做到这一点。我经常这样做的方式是使用row_number函数对按您感兴趣的键划分的行进行排序,然后只选择最上面的一个。像这样:

select sourcetable,CallData,PhoneNum,FK_ApplicationID,CreateDateTime
from
(
    Select sourcetable,CallData,PhoneNum,DM_PhoneNumbers.FK_ApplicationID,d.CreateDateTime, ROW_NUMBER() Over (Partition by PhoneNum order by d.CreateDateTime desc) rownum
    from Dial D
    join DavikerTWF_OTS.dbo.DM_PhoneNumbers 
    on PhoneNum= PhoneNum1 Collate latin1_general_CI_AS
    where PhoneNum in
        (
        Select phonenums from #tmp
        )
) AllRows
where rownum = 1

有几种方法可以做到这一点。我经常这样做的方式是使用row_number函数对按您感兴趣的键划分的行进行排序,然后只选择最上面的一个。像这样:

select sourcetable,CallData,PhoneNum,FK_ApplicationID,CreateDateTime
from
(
    Select sourcetable,CallData,PhoneNum,DM_PhoneNumbers.FK_ApplicationID,d.CreateDateTime, ROW_NUMBER() Over (Partition by PhoneNum order by d.CreateDateTime desc) rownum
    from Dial D
    join DavikerTWF_OTS.dbo.DM_PhoneNumbers 
    on PhoneNum= PhoneNum1 Collate latin1_general_CI_AS
    where PhoneNum in
        (
        Select phonenums from #tmp
        )
) AllRows
where rownum = 1

有几种方法可以做到这一点。我经常这样做的方式是使用row_number函数对按您感兴趣的键划分的行进行排序,然后只选择最上面的一个。像这样:

select sourcetable,CallData,PhoneNum,FK_ApplicationID,CreateDateTime
from
(
    Select sourcetable,CallData,PhoneNum,DM_PhoneNumbers.FK_ApplicationID,d.CreateDateTime, ROW_NUMBER() Over (Partition by PhoneNum order by d.CreateDateTime desc) rownum
    from Dial D
    join DavikerTWF_OTS.dbo.DM_PhoneNumbers 
    on PhoneNum= PhoneNum1 Collate latin1_general_CI_AS
    where PhoneNum in
        (
        Select phonenums from #tmp
        )
) AllRows
where rownum = 1

根本不清楚你想在这里做什么。一些示例数据和预期结果比我们没有的一堆sql表更能说明问题。如果您只需在最后一个选择中添加行(按Phonenum顺序按D.createdatetime desc划分),那么正确的行是否有数字1?@JamesZ您就快到了,但是OP需要将
createdatetime
column转换为datetime数据类型,以获得正确的日期顺序。@M.Ali该示例有点不正确,它们已经是正确的日期时间数据了,我只是将其作为一个示例使用。您在这里尝试执行的操作一点也不清楚。一些示例数据和预期结果比我们没有的一堆sql表更能说明问题。如果您只需在最后一个选择中添加行(按Phonenum顺序按D.createdatetime desc划分),那么正确的行是否有数字1?@JamesZ您就快到了,但是OP需要将
createdatetime
column转换为datetime数据类型,以获得正确的日期顺序。@M.Ali该示例有点不正确,它们已经是正确的日期时间数据了,我只是将其作为一个示例使用。您在这里尝试执行的操作一点也不清楚。一些示例数据和预期结果比我们没有的一堆sql表更能说明问题。如果您只需在最后一个选择中添加行(按Phonenum顺序按D.createdatetime desc划分),那么正确的行是否有数字1?@JamesZ您就快到了,但是OP需要将
createdatetime
column转换为datetime数据类型,以获得正确的日期顺序。@M.Ali该示例有点不正确,它们已经是正确的日期时间数据了,我只是将其作为一个示例使用。您在这里尝试执行的操作一点也不清楚。一些示例数据和预期结果比我们没有的一堆sql表更能说明问题。如果您只需在最后一个选择中添加行(按Phonenum顺序按D.createdatetime desc划分),那么正确的行是否有数字1?@JamesZ您就快到了,但是OP需要将
createdatetime
列转换为datetime数据类型,以获得正确的日期顺序。@M.Ali该示例有点不正确,它们已经是正确的日期时间数据了,我只是将其作为示例使用。这很好,除了一件事,当我尝试连接另一个表时,我希望它选择其“FK_应用程序ID”我将编辑您的答案,而不是DM_Phonenumbers,以向您展示我在做什么。这很好,除了一件事,当我尝试加入另一个表时,我希望它选择其“FK_应用程序ID”而不是DM_Phonenumbers,我将编辑您的答案以向您展示我在做什么。这很好,除了一件事,当我尝试加入另一个表时,我希望它选择其“FK_应用程序ID”而不是DM_电话号码,我将编辑您的答案以显示我正在做的事情。这很好,除了一件事,当我尝试加入另一个表时,我希望它选择其“FK_应用程序ID”而不是DM_电话号码,我会编辑你的答案,让你知道我在做什么。