Asp.net 获取每个用户的最新记录,其中值为';K';,操作id为null或其状态为1
我在SQL Server中有以下表格:Asp.net 获取每个用户的最新记录,其中值为';K';,操作id为null或其状态为1,asp.net,tsql,linq-to-sql,Asp.net,Tsql,Linq To Sql,我在SQL Server中有以下表格: user_id, value, date, action_id ---------------------------------- 1 A 1/3/2012 null 1 K 1/4/2012 null 1 B 1/5/2012 null 2 X 1/3/2012 null 2 K 1/4/2012
user_id, value, date, action_id
----------------------------------
1 A 1/3/2012 null
1 K 1/4/2012 null
1 B 1/5/2012 null
2 X 1/3/2012 null
2 K 1/4/2012 1
3 K 1/3/2012 null
3 L 1/4/2012 2
3 K 1/5/2012 3
4 K 1/3/2012 null
action_id, state
----------------------------------
1 0
2 1
3 1
4 0
5 1
我需要返回每个用户的最新记录,其中值为“K”,操作id为null或其状态设置为1。这是我想要的结果集:
user_id, value, date, action_id
----------------------------------
3 K 1/5/2012 3
4 K 1/3/2012 null
对于UsRyid 1,最近的值是B,它的动作ID是NULL,所以我认为这是最近的记录,但是它的值不是K.</P>
对于用户_id 2,最近的值是K,但操作id 1的状态为0,因此我回退到X,但X不是K
用户id 3和4很简单
我对ASP.NET中的Linq to SQL查询很感兴趣,但目前T-SQL也不错。SQL查询应该是:
Select Top 1 T1.* from Table1 T1
LEFT JOIN Table2 T2
ON T1.action_id = T2.action_id
Where T1.Value = 'K' AND (T1.action_id is null or T2.state = 1)
Order by T1.date desc
LINQ查询:
var result = context.Table1.Where(T1=> T1.Value == "K"
&& (T1.action_id == null ||
context.Table2
.Where(T2=>T2.State == 1)
.Select(T2 => T2.action_id).Contains(T1.action_id)))
.OrderByDescending(T => T.date)
.FirstOrDefault();
祝你好运 SQL查询将是:
Select Top 1 T1.* from Table1 T1
LEFT JOIN Table2 T2
ON T1.action_id = T2.action_id
Where T1.Value = 'K' AND (T1.action_id is null or T2.state = 1)
Order by T1.date desc
LINQ查询:
var result = context.Table1.Where(T1=> T1.Value == "K"
&& (T1.action_id == null ||
context.Table2
.Where(T2=>T2.State == 1)
.Select(T2 => T2.action_id).Contains(T1.action_id)))
.OrderByDescending(T => T.date)
.FirstOrDefault();
祝你好运 这将为您的规范中描述的所有用户选择顶部条目,而不是只选择数据库中最新条目的
top 1
。这里我假设您的表名为users
和actions
:
WITH usersactions as
(SELECT
u.user_id,
u.value,
u.date,
u.action_id,
ROW NUMBER() OVER (PARTITION BY u.user_id ORDER BY u.date DESC, u.action_id DESC) as row
FROM users u
LEFT OUTER JOIN actions a ON u.action_id = a.action_id
WHERE
u.value = 'K' AND
(u.action_id IS NULL OR a.state = 1)
)
SELECT * FROM usersactions WHERE row = 1
或者,如果您不想使用CTE:
SELECT * FROM
(SELECT
u.user_id,
u.value,
u.date,
u.action_id,
ROW NUMBER() OVER (PARTITION BY u.user_id ORDER BY u.date DESC, u.action_id DESC) as row
FROM users u
LEFT OUTER JOIN actions a ON u.action_id = a.action_id
WHERE
u.value = 'K' AND
(u.action_id IS NULL OR a.state = 1)
) useractions
WHERE row = 1
这将为您的规范中描述的所有用户选择顶部条目,而不是只选择数据库中最新条目的
top 1
。这里我假设您的表名为users
和actions
:
WITH usersactions as
(SELECT
u.user_id,
u.value,
u.date,
u.action_id,
ROW NUMBER() OVER (PARTITION BY u.user_id ORDER BY u.date DESC, u.action_id DESC) as row
FROM users u
LEFT OUTER JOIN actions a ON u.action_id = a.action_id
WHERE
u.value = 'K' AND
(u.action_id IS NULL OR a.state = 1)
)
SELECT * FROM usersactions WHERE row = 1
或者,如果您不想使用CTE:
SELECT * FROM
(SELECT
u.user_id,
u.value,
u.date,
u.action_id,
ROW NUMBER() OVER (PARTITION BY u.user_id ORDER BY u.date DESC, u.action_id DESC) as row
FROM users u
LEFT OUTER JOIN actions a ON u.action_id = a.action_id
WHERE
u.value = 'K' AND
(u.action_id IS NULL OR a.state = 1)
) useractions
WHERE row = 1
此查询将返回所需的结果集:
SELECT
*
FROM
(
SELECT
user_id
,value
,date
,action_id
,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date DESC) RowNum
FROM
testtable
WHERE
value = 'K'
) testtable
WHERE
RowNum = 1
此查询将返回所需的结果集:
SELECT
*
FROM
(
SELECT
user_id
,value
,date
,action_id
,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY date DESC) RowNum
FROM
testtable
WHERE
value = 'K'
) testtable
WHERE
RowNum = 1
如果用户id和日期组合是唯一的,您也可以尝试以下方法 确保获取联接中谓词的顺序,以便能够使用索引:
SELECT
testtable.*
FROM
(
SELECT
user_id
,MAX(date) LastDate
FROM
testtable
WHERE
value = 'K'
GROUP BY
user_id
) tblLastValue
INNER JOIN
testtable
ON
testtable.user_id = tblLastValue.user_id
AND
testtable.date = tblLastValue.LastDate
如果用户id和日期组合是唯一的,您也可以尝试以下方法 确保获取联接中谓词的顺序,以便能够使用索引:
SELECT
testtable.*
FROM
(
SELECT
user_id
,MAX(date) LastDate
FROM
testtable
WHERE
value = 'K'
GROUP BY
user_id
) tblLastValue
INNER JOIN
testtable
ON
testtable.user_id = tblLastValue.user_id
AND
testtable.date = tblLastValue.LastDate
我想你忘了T1.action\u id为null的部分。你能同时更新这两个查询吗?T-SQL查询中的where子句应该是“where T1.value='K'和(T1.action_id为null或T2.state=1)”Visual Studio无法识别where子句中的T.T2.state:(没有intellisense支持。我得到一个编译器错误。它实际上不会显示T2中的任何列。我想你忘记了T1.action\u id为null的部分。你能更新这两个查询吗?t-SQL查询中的where子句应该是“where T1.value='K'和(T1.action\u id为null或T2.state=1)”Visual Studio无法识别where子句中的T.T2.state.:(它没有intellisense支持。我收到一个编译器错误。它实际上不会显示T2中的任何列。