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_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)的更多相关文章

  1. MSSQL—按照某一列分组后取前N条记录

    以前在开发的时候遇到过一个需求,就是要按照某一列进行分组后取前几条数据,今天又有同事碰到了,帮解决了之后顺便写一篇博客记录一下. 首先先建一个基础数据表,代码如下: IF OBJECT_ID(N'Te ...

  2. MSSQL 分组后取每组第一条(group by order by)

    查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...

  3. SQL Server 分组后取Top N

    SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...

  4. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  5. SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

    获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...

  6. Oracle分组后取某列最大值的行数据

    select * from ( select last_comment, row_number() over(partition by employeeid,roadline,stationname ...

  7. Sql语句groupBY分组后取最新一条记录的SQL

    一.问题 groupBY分组后取最新一条记录的SQL的解决方案. 二.解决方案 select Message,EventTime from PT_ChildSysAlarms as a where E ...

  8. SQL 分组后取最小行号记录

    本示例测试两个表联接查询后,分组并取分组后的最小行号记录 测试表: tb1表结构如下: CREATE TABLE [dbo].[tb1]( ) NOT NULL, ) NULL, ) NULL, CO ...

  9. SQL数据分组后取最大值或者取前几个值(依照某一列排序)

    今日做项目的时候,项目中遇到须要将数据分组后,分组中的最大值,想了想,不知道怎么做.于是网上查了查,最终找到了思路,经过比較这个查询时眼下用时最快的,事实上还有别的方法,可是我认为我们仅仅掌握最快的方 ...

随机推荐

  1. 关于文档头部定义和meta元素

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. saltstack快速入门

    SALTSTACK是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基础设施中许多特定问题的多任务系 ...

  3. android学习-异步消息处理机制

    消息处理机制主要对象:Looper,Handler,Message(还有MessageQueue和Runnable) Looper不断从MessageQueue消息队列中取出一个Message,然后传 ...

  4. java.lang.ArithmeticException: Rounding necessary

    这个错误就是精度丢失问题 https://blog.csdn.net/qq496013218/article/details/70792655

  5. java中的复制数组arraycopy()

    System.arraycopy();//静态方法,在System类中定义,注意copy首字母是小写的 例子: int[] a = {1,2,3,4,5}; int[] b = {9,8,7,6}; ...

  6. Hive导入数据的四种方法

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  7. 关于Sqlite的一个demo

      直接上代码: class DBHelperSqlite { ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetC ...

  8. 阿里云centos6.5实践编译安装LNMP架构web环境

    LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. 本次测试需求: **实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 ngx_pa ...

  9. sql中替换换行符和空格的示例

    select DiscussID,L.Name as LocationName , C.Name as ClientName, REPLACE(BrandName,' ','') BrandName ...

  10. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...