Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于日期列选择非重复项-SQL Server_Sql_Sql Server_Select_Join - Fatal编程技术网

基于日期列选择非重复项-SQL Server

基于日期列选择非重复项-SQL Server,sql,sql-server,select,join,Sql,Sql Server,Select,Join,我有两张这样的桌子: Clients ID | Name | DOB | etc... 1 | Andy | 26/12/90 | 2 | Bob | 27/10/93 | 3 | Callum | 11/12/97 | 4 | Dave | 06/01/64 | 5 | Andy | 01/06/89 | ClientRecordEntries ID | cID | DateSaved

我有两张这样的桌子:

Clients                 
ID  |  Name  |  DOB      | etc...   
1   | Andy   | 26/12/90  |
2   | Bob    | 27/10/93  |
3   | Callum | 11/12/97  |
4   | Dave   | 06/01/64  |
5   | Andy   | 01/06/89  |

ClientRecordEntries
ID | cID | DateSaved      | Address               | Phone Number | Blah blah blah...
1  | 1   | 06/03/13 03:01 | 1 High Street         | 0754812374   |
2  | 1   | 06/03/13 04:05 | 1 High Street         | 0854123474   |
3  | 5   | 06/03/13 04:23 | 742 Evergreen Terrace | 0548162384   |
4  | 4   | 06/03/13 03:27 | 5 Spooner St          | 0512348455   |
5  | 3   | 06/03/13 05:03 | 6 Cromwell Avenue     | 0745289324   |
6  | 5   | 06/03/13 05:04 | 743 Evergreen Terrace | 0548162384   |
7  | 5   | 06/03/13 05:17 | 743 Evergreen Terrace | 0461238489   |
8  | 2   | 06/03/13 05:18 | 45 High Street        | 0682374988   |
其思想是,关于每个客户机的一些基本的、不可变的信息存储在第一个表中,而更详细的信息存储在第二个表中。当编辑客户机的数据时,而不是编辑ClientRecordEntries中相应的行时,会添加一个带有时间戳的全新行,以便保留以前所做的所有更改的记录。因此,每个客户机的当前信息是第二个表中对应于其ID并具有最新时间戳的行

例如,对于居住在743 Evergreen Terrace的ID为5的客户,其电话号码为0461238489,其详细信息已编辑两次,因此在第二个表的第3、6和7行中共输入了三次

我的问题是,如何将第一个表上的查询结果与第二个表连接起来,但删除每个客户机上除最新信息以外的所有行?例如,在上面的示例中,我想为每个名为Andy的人选择当前信息,因此我希望得到结果:

Name |  DOB     | Address               | Phone Number | etc...
Andy | 26/12/90 | 1 High  Street        | 0854123474   |
Andy | 01/06/89 | 743 Evergreen Terrace | 0461238489   |
我猜我想要像SELECT*FROM Clients在Clients.ID=ClientRecordEntries.cID上加入ClientRecordEntries这样的东西,其中Name='Andy'。。。然后用MAXSavedDate做点什么,但我被卡住了。有什么建议吗

是的,我意识到SELECT*将显示比我上面键入的更多的列,但我正在简化事情

如果SQL Server起作用的话,我会使用它。

术语“删除重复项”,如果您的意思是只想在投影过程中隐藏重复的值,您可以在此上使用窗口函数

WITH records AS
(
    SELECT  ID,cID,DateSaved,Address ,[Phone Number],
            ROW_NUMBER() OVER (PARTITION BY cid ORDER BY DateSaved DESC) rn
    FROM    ClientRecordEntries
)
SELECT  a.*, DateSaved,Address ,[Phone Number]
FROM    Clients a
        INNER JOIN records b
            ON a.ID = b.cid
WHERE   b.rn = 1
试试这个。您可以使用CTE和ROW_编号来实现这一点


除非您有少量客户机,否则您应该在表ClientRecordEntries中添加一个标志,以指示出于性能原因每个客户机的哪一行是最近的,并且还应该添加一个覆盖此标志和cId列的索引


由于很少需要查看这些旧信息,另一种解决方案是使用第三个表来保存这些旧信息。通常,会有一个表来保存来自其他表的所有旧信息;还有一些其他信息,如编辑时间和用户。

对不起,我不知道“投影期间”是什么意思。@Georgeillo这是投影-意思是选择。是的,很抱歉标题可能措词不当,我不想删除重复的条目,我只是不想选择它们。
WITH CTE  
AS  
(  
   SELECT *,  
      ROW_NUMBER() OVER (PARTITION BY CID ORDER BY DateSaved DESC) RN  
   FROM ClientRecordEntries  
)  

SELECT *   
FROM Clients C  
INNER JOIN CTE CT  
ON CT.CID = C.ID  
WHERE C.NAME = 'Andy' 
AND RN = 1