Sql server Linq到Sql/Sql查询帮助
我有一张这样的桌子:Sql server Linq到Sql/Sql查询帮助,sql-server,linq-to-sql,Sql Server,Linq To Sql,我有一张这样的桌子: Id PageId Key Content LastUpdated --------------------------------------------- 1 12 key1 content1 02-21-2010 2 12 key1 content2 02-25-2010 3 12 key2 content1 02-21-2010 4 1
Id PageId Key Content LastUpdated
---------------------------------------------
1 12 key1 content1 02-21-2010
2 12 key1 content2 02-25-2010
3 12 key2 content1 02-21-2010
4 12 key2 content2 02-25-2010
5 12 key3 content1 02-21-2010
2 12 key1 content2
4 12 key2 content2
5 12 key3 content1
我需要能够做的是按照LastUpdated排序的PageId查询出一个不同的列表,因此我的结果如下所示:
Id PageId Key Content LastUpdated
---------------------------------------------
1 12 key1 content1 02-21-2010
2 12 key1 content2 02-25-2010
3 12 key2 content1 02-21-2010
4 12 key2 content2 02-25-2010
5 12 key3 content1 02-21-2010
2 12 key1 content2
4 12 key2 content2
5 12 key3 content1
我正在使用Linq-2-Sql,但如果需要,我可以使用SP。关于如何实现这一点的任何帮助都将非常有用,谢谢 这里有一个想法,可以使用tsql将其放入SP中。(假设LastUpdate是一个日期时间字段,而不是您列出的格式的字符串,并假设至少使用SQL 2005。如果这两个假设不正确,则可以克服这两个假设中的任何一个):
在SQL中,其工作原理如下:
WITH i as (
SELECT Id, PageId, Key, Content, dense_rank() over(PARTITION BY Key ORDER BY LastUpdated desc) as pos
FROM myTable
)
SELECT Id, PageId, Key, Content
FROM i
WHERE pos = 1
在这里,我假设您的意思是“按键显示不同的列表”,而不是“按页面ID显示不同的列表”
您应该知道,如果每个密钥的日期不是唯一的,这将返回密钥最长日期的所有记录。如果您只想拥有其中一个字段,则可以向ORDER BY中添加其他字段
如果您不关心每个键返回几个非唯一记录中的哪一个,那么可以使用ROW_NUMBER()而不是densite_RANK() 基于PageId的不同列表将只返回1行,而不是3行。看起来您需要一个不同的“键”,但只返回包含最近一次更新的行。这是正确的吗?这很有效。“您的解决方案和Joe的解决方案之间有什么性能差异吗?”Paul我假设没有联接。但这取决于许多因素,因此最好测试您的具体情况。您的解决方案和Frank的解决方案之间是否存在性能差异?我不这么认为,但不能100%确定。尝试每种方法并比较执行计划、IO统计数据等。我只记得在使用MAX时比ROWNUMBER表现更好。再次针对您的具体情况测试每一个。