Asp.net 获取每个用户的最新记录,其中值为';K';,操作id为null或其状态为1

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

我在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     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中的任何列。