My SQL和LINQ 实现ROW_NUMBER() OVER

Oracle 和SQL server都有ROW_NUMBER() OVER这个功能函数,主要用于分组排序,而MySQL 却没有

SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N,
               H.* FROM M_ALARMHANDLE H) M
               WHERE M.N=1

 SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N, H.* FROM M_ALARMHANDLE H,这个语句就是用于分组      排序的语句,后面的where M.N=1是取得分组排序后组中第一行,

对应的My SQL语句为

select HANDLELSH,ALARMINDEX,HANDLESTATUS,HANDLETIME,HANDLEPERSON,HANDLEDESCRIPTION,HANDLETYPE,rank from
(
 select H.*,@rownum:[email protected]+1 ,
 if(@Group=H.ALARMINDEX,@rank:[email protected]+1,@rank:=1) as rank,
 @Group:=H.ALARMINDEX
 from (
 select * from M_ALARMHANDLE order by HANDLETIME DESC
 ) H ,(select @rownum :=0 , @Group := null ,@rank:=0) a ) result where rank=1;

对应的LINQ语句为

 var M_ALARMHANDLEList = (from HA in dbManager.M_ALARMHANDLE
                                                group HA by HA.ALARMINDEX into HH
                                                from MH in HH
                                                orderby MH.HANDLETIME descending
                                                select new
                                                {
                                                    RowNo = RowNo+1,
                                                    MH.HANDLELSH,
                                                    MH.HANDLEDESCRIPTION,
                                                    MH.HANDLEPERSON,
                                                    MH.HANDLESTATUS,
                                                    MH.HANDLETIME,
                                                    MH.HANDLETYPE,
                                                    MH.ALARMINDEX
                                                }).Where(m=>m.RowNo==1);

  

测试功能举例(摘自他人但已经测过)

drop table if exists Wmy;
create table Wmy (id int ,GroupId int ,salary decimal(10,2) );
insert into Wmy values
(1,10,5500.00),
(2,10,4500.00),
(3,20,1900.00),
(4,20,4800.00),
(5,40,6500.00),
(6,40,14500.00),
(7,40,44500.00),
(8,50,6500.00),
(9,50,7500.00);
select id,GroupId,salary,rank from
(
 select H.id,H.GroupId,H.salary,@rownum:[email protected]+1 ,
 if(@Group=H.GroupId,@rank:[email protected]+1,@rank:=1) as rank,
 @Group:=H.GroupId
 from (
 select id,GroupId,salary from Wmy order by GroupId asc ,salary desc
 ) H ,(select @rownum :=0 , @Group := null ,@rank:=0) a ) result;

 

时间: 2024-08-29 17:34:15

My SQL和LINQ 实现ROW_NUMBER() OVER的相关文章

sql转Linq的工具

本文转载:http://www.cnblogs.com/huangxincheng/archive/2011/05/12/2044990.html 介绍一个小工具 Linqer 这些天写Linq挺烦人的,就上网搜搜可有什么好的sql转Linq的工具,咦,马上就看上了Linqer. 哈哈,介绍一下使用方法吧: 官方下载网站:http://sqltolinq.com/download. 第一步:运行这个神马文件. 第二步:指定一个路径给它.他会生成一个Linqer.exe可运行的文件. 第三步:运行

Linq to EF 和 Linq to SQL 中间Linq 产生的SQL语句

一,Linq to EF using System; using System.Runtime.CompilerServices; using System.Linq; using System.Data; namespace EntityframeworkSQL { class Program { static void Main(string[] args) { using (CustomerEntities customerEntities = new CustomerEntities()

SQL To LinQ 你知道么?

学习linQ的时候,你应该用到过LinQ to SQL 的工具---LinQPad,刚开始用,不太熟悉,尤其是涉及到多表查询,不会写LinQ语句怎么办? 这不是问题,下面先来介绍另一个工具 SQL to LinQ,SQL已经学了很长时间了,做系统的时候经常用到,对于SQL语句应该不陌生吧. 打开SQL Server 2008 ,新建查询,我想把三张表中的信息一一对应起来,并且只要我想要的字段的信息,SQL语句: SELECT [t2].[VirtualExamRoomId], [t2].[Vir

SQL、LINQ、Lambda 三种用法(转)

SQL.LINQ.Lambda 三种用法 颜色注释: SQL LinqToSql Lambda QA 1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from student Linq: from s in Students select new { s.SNAME, s.SSEX, s.CLASS } Lambda: Students.Select( s => new { SNAME = s.SNAME,SSEX =

SQL、LINQ、Lambda 三种用法互换

SQL.LINQ.Lambda 三种用法颜色注释: SQL LinqToSql Lambda QA1. 查询Student表中的所有记录的Sname.Ssex和Class列.select sname,ssex,class from studentLinq: from s in Students select new { s.SNAME, s.SSEX, s.CLASS }Lambda: Students.Select( s => new { SNAME = s.SNAME,SSEX = s.SS

Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍

无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和InsertAllOnSubmit,前者是将一个实体标记为一个插入状态,而后都是将一个集合标记为插入状态,... 无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit

SQL、LINQ和Lambda表达式

首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询这三者的不同实现. 简单介绍 LINQ(Language Integrate Query)是语言集成查询他在对象和数据之间建立一种对应的关系,可以使用访问内存对象的方式查询数据集合.LINQ查询是C#中的一种语言构造.因此开发人员可以再C#代码汇总嵌套类似于SQL语句的查询表达式,从而实现数据查询的

SQL Server 排序函数 ROW_NUMBER和RANK 用法总结

下面的例子和SQL语句均在SQL Server 2008环境下运行通过,使用SQL Server自带的AdventureWorks数据库. 转载请注明此文原创自 CSDN TJVictor的专栏:http://blog.csdn.net/tjvictor/archive/2009/07/08/4331039.aspx 1.ROW_NUMBER()基本用法: SELECT  SalesOrderID,  CustomerID,  ROW_NUMBER() OVER (ORDER BY SalesO

sql、linq和lambda查询语句比较inner join和group by组合使用及匿名类型的处理

使用EF自己做的小功能需要遇到inner join和group by组合使用及匿名类型的处理,搜了很多,基本不能满足自己的需要,所以总结了也实现了就自己写出来,已备查看及伙伴查询参考(一般的语句查询就不说了,网络搜索很多) 语句查询的背景(要不直接看语句故估计也够呛):主要想实现类似QQ相册的功能展示,页面展示所有相册列表,主要包括:相册里面的相册个数,相册中的某一个张照片作为相册的默认背景图,相册名,相册描述,删除和编辑功能 sql server:(这个就比较简单) select count(