Sql_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)
Dim sql As String = " SELECT xp.*, "
sql = sql + " xf_owner.ownername, "
sql = sql + " xf_receiver.receivename, "
sql = sql + " lastprice = "
sql = sql + " ( "
sql = sql + " SELECT TOP 1 "
sql = sql + " lp.tonprice "
sql = sql + " FROM "
sql = sql + " ( "
sql = sql + " SELECT * "
sql = sql + " FROM xf_price "
sql = sql + " WHERE pk_price IN ( "
sql = sql + " SELECT TOP 2 "
sql = sql + " pk_price "
sql = sql + " FROM xf_price "
sql = sql + " WHERE pk_pricegroup = xp.pk_pricegroup "
sql = sql + " AND pk_owner = xp.pk_owner "
sql = sql + " AND pk_receiver = xp.pk_receiver "
sql = sql + " ORDER BY enabletime DESC "
sql = sql + " ) "
sql = sql + " ) lp "
sql = sql + " ORDER BY lp.enabletime ASC "
sql = sql + " ), "
sql = sql + " transname = CASE "
sql = sql + " WHEN transtype = 0 THEN "
sql = sql + " '外部运输' "
sql = sql + " WHEN transtype = 1 THEN "
sql = sql + " '厂内转运' "
sql = sql + " ELSE "
sql = sql + " '厂外转运' "
sql = sql + " END "
sql = sql + " FROM xf_price xp "
sql = sql + " LEFT JOIN xf_owner "
sql = sql + " ON xf_owner.pk_owner = xp.pk_owner "
sql = sql + " LEFT JOIN xf_receiver "
sql = sql + " ON xf_receiver.pk_receiver = xp.pk_receiver "
sql = sql + " WHERE xp.dr = 0 "
sql = sql + " AND xp.pk_pricegroup = @pk_pricegroup "
sql = sql + " AND pk_price IN ( "
sql = sql + " SELECT TOP 1 "
sql = sql + " pk_price "
sql = sql + " FROM xf_price "
sql = sql + " WHERE pk_pricegroup = xp.pk_pricegroup "
sql = sql + " AND pk_owner = xp.pk_owner "
sql = sql + " AND pk_receiver = xp.pk_receiver "
sql = sql + " ORDER BY enabletime DESC "
sql = sql + " ) "
sql = sql + " ORDER BY xp.enabletime DESC; "
Dim com As New SqlClient.SqlCommand(sql, strCon)
com.Parameters.Add(New SqlClient.SqlParameter("@pk_pricegroup", pk_pricegroup))
Dim ds As New DataSet
Dim adapter As New SqlClient.SqlDataAdapter(com)
strCon.Open()
adapter.Fill(ds, "xf_price")
strCon.Close() 主要思路:先取整体结果集,然后条件取按时间倒序排第一条记录的主键,然后有个字段需要取上一次修改的结果值(别名lastprice,即上次修改的值tonprice),则采用先TOP 2 取两条数据,然后按时间倒序排,再TOP 1取第一条便是上一次修改的结果值。
注意xf_price xp 的妙用,可以解决当主键条件取第一条时只显示一条返回记录的问题。
Sql_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)的更多相关文章
- MSSQL—按照某一列分组后取前N条记录
以前在开发的时候遇到过一个需求,就是要按照某一列进行分组后取前几条数据,今天又有同事碰到了,帮解决了之后顺便写一篇博客记录一下. 首先先建一个基础数据表,代码如下: IF OBJECT_ID(N'Te ...
- MSSQL 分组后取每组第一条(group by order by)
查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...
- SQL Server 分组后取Top N
SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...
- 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录
开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...
- SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...
- Oracle分组后取某列最大值的行数据
select * from ( select last_comment, row_number() over(partition by employeeid,roadline,stationname ...
- Sql语句groupBY分组后取最新一条记录的SQL
一.问题 groupBY分组后取最新一条记录的SQL的解决方案. 二.解决方案 select Message,EventTime from PT_ChildSysAlarms as a where E ...
- SQL 分组后取最小行号记录
本示例测试两个表联接查询后,分组并取分组后的最小行号记录 测试表: tb1表结构如下: CREATE TABLE [dbo].[tb1]( ) NOT NULL, ) NULL, ) NULL, CO ...
- SQL数据分组后取最大值或者取前几个值(依照某一列排序)
今日做项目的时候,项目中遇到须要将数据分组后,分组中的最大值,想了想,不知道怎么做.于是网上查了查,最终找到了思路,经过比較这个查询时眼下用时最快的,事实上还有别的方法,可是我认为我们仅仅掌握最快的方 ...
随机推荐
- Oracle 数据库实例
Oracle- 数据库的实例,表空间,用户,表之间的关系 一.完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例 1.数据库是一些列物理文件的集合(数据文件,控制文件,联机文件, ...
- implements和extends的区别
extends可以理解为全盘继承了父类的功能 implements可以理解为为这个类附加一些额外的功能 举个例子,Animal是一个父类,cat,dog,bird,insect都extends了Ani ...
- Fiddler Web Debugger的下载和安装(图文详解)
不多说,直接上干货! Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的数据 ...
- Scope及其子类介绍
之前写的文章: 关于作用域范围Scope Scope及相关的子类如下: 同时有些Scope还继承了Scope.ScopeListener类,如下: 1.StarImportScope及ImportSc ...
- golang-nsq消息队列应用
1. 安装nsq brew install nsq 2.启动nsq https://nsq.io/overview/quick_start.html 3.golang client var produ ...
- httpClient 超时时间设置(转)
尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...
- mysql中难以理解的sql
工作中遇到这样的例子, CASE type WHEN 1 THEN '普通红包' WHEN 2 THEN '普通礼包加油卡' WHEN 3 THEN '优 惠码兑换加油卡' WHEN 4 THEN ' ...
- PTA (Advanced Level) 1024 Palindromic Number
Palindromic Number A number that will be the same when it is written forwards or backwards is known ...
- Cookie的格式及组成、页面间传参实例
做项目需要页面间参数传递,搜索了一下网上的回复,发现可以用cookie解决,借此学习cookie的格式及组成: Cookie由变量名和值组成,类似Javascript变量.其属性里既有标准的Cooki ...
- linux 权限详解
转载自博客园: http://www.cnblogs.com/123-/p/4189072.html 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所 ...