我想从字段中找到最高的AutoIncremented值.(它不会在我可以使用的插入后获取@@SCOPE_IDENTITY等)这两个查询中的哪一个会运行得更快或提供更好的性能.
Id是主要的关键和autoincrement领域Table1.这适用于Sql Server 2005.
SELECT MAX(Id) FROM Table1
SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC
Run Code Online (Sandbox Code Playgroud)
[编辑]
在这种情况下,Id是我已定义聚簇索引的字段.
如果索引是ID DESC那么..
是的,如果
1. Id是聚簇索引+主键,那么知道如何影响性能会很好.
2. Id是聚簇索引而不是主键.
3. Id是非聚集索引ASC +主键.
4. Id是非聚集索引ASC而不是主键.
5. Id是非聚集索引DESC +主键.
6. Id是非聚集索引DESC而不是主键.
我只是AutoIncrement
希望它不是一个很高的命令!
我有一个Hive表,其中包含客户呼叫的数据.为简单起见,请考虑它有2列,第一列包含客户ID,第二列包含调用的时间戳(unix时间戳).
我可以查询此表以查找每个客户的所有呼叫:
SELECT * FROM mytable SORT BY customer_id, call_time;
Run Code Online (Sandbox Code Playgroud)
结果是:
Customer1 timestamp11
Customer1 timestamp12
Customer1 timestamp13
Customer2 timestamp21
Customer3 timestamp31
Customer3 timestamp32
...
Run Code Online (Sandbox Code Playgroud)
是否有可能为每个客户创建一个Hive查询,从第二次调用开始,两次成功调用之间的时间间隔?对于以上示例,查询应返回:
Customer1 timestamp12-timestamp11
Customer1 timestamp13-timestamp12
Customer3 timestamp32-timestamp31
...
Run Code Online (Sandbox Code Playgroud)
我试图改进sql解决方案中的解决方案,但我坚持使用Hive限制:它仅接受FROM中的子查询,并且连接必须仅包含相等性.
谢谢.
EDIT1:
我试过使用Hive UDF函数:
public class DeltaComputerUDF extends UDF {
private String previousCustomerId;
private long previousCallTime;
public String evaluate(String customerId, LongWritable callTime) {
long callTimeValue = callTime.get();
String timeDifference = null;
if (customerId.equals(previousCustomerId)) {
timeDifference = new Long(callTimeValue - previousCallTime).toString();
} …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来比较同一个表中2行之间的差异.从我在这里找到的(如何获得列字段的两行之间的差异?)这几乎是我想要的.我做了以下代码:
create table #tmpTest
(
id_fund int null,
id_ShareType int null,
ValueDate datetime null,
VarNAV float null,
FundPerf float null,
)
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV)
values(1,1,'20140101',100)
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV)
values(1,1,'20140102',20)
update #tmpTest
set hrc.FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV
from #tmpTest hrc
left join #tmpTest hrn on hrn.ValueDate = (select min(ValueDate) from #tmpTest where ValueDate > hrc.ValueDate)
and hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType
Run Code Online (Sandbox Code Playgroud)
我的问题是,我正在计算的结果从第1行而不是第2行开始.
下面是我得到的结果:
id_fund id_ShareType ValueDate VarNAV FundPerf
------- …Run Code Online (Sandbox Code Playgroud) 为清楚起见,按照建议将问题总结在一行中:
假设我有一张Users桌子和一个User班级。
每个User都有以下字段:
SignUpDate非空DateTime字段UserType一个 int 字段,对于这个问题,假设它是1或0我想选择注册时间少于 7 天且用户类型不同的所有用户。
我目前(悲惨的)尝试包括一个OrderBy(r=>r.SignUpDate)和一个 .ToList,这没什么大不了的,因为每 2 周的用户数量并不多。(我从中抓取了重叠周的所有用户并比较了数据)。
但是,我发现我目前的解决方案很差。我不知道解决这个问题的正确方法是什么。
我认为这里的核心问题是我不知道如何在排序后解决LINQ to Entities 中“选择每两个对应记录”的概念。
非常感谢任何帮助,我对如何在将来不开始我自己的问题的情况下解决此类问题感兴趣。
SignUpDate UserType
------------------------------------
2008-11-11 1
2008-11-12 0
2008-11-13 0
2008-12-13 0
2008-12-15 1
Run Code Online (Sandbox Code Playgroud)
任何有意义的方式来表明有问题的对是:
2008-11-11 1
2008-11-12 0
Run Code Online (Sandbox Code Playgroud)
(因一天不同类型而不同)
和
2008-12-13 0
2008-12-15 1
Run Code Online (Sandbox Code Playgroud)
(因两天不同类型而不同)
这是我找到的相关 SQL 解决方案。
我有一个简单的表,包含MySQL中的股价:
Table `share_prices`
+----------+-------+---------------------+
| stock_id | price | date |
+----------+-------+---------------------+
| 1 | 0.05 | 2010-02-24 01:00:00 |
| 2 | 3.25 | 2010-02-24 01:00:00 |
| 3 | 3.30 | 2010-02-24 01:00:00 |
| 1 | 0.50 | 2010-02-23 23:00:00 |
| 2 | 1.90 | 2010-02-23 23:00:00 |
| 3 | 2.10 | 2010-02-23 23:00:00 |
| 1 | 1.00 | 2010-02-23 19:00:00 |
| 2 | 1.00 | 2010-02-23 19:00:00 |
| 3 | 1.00 …Run Code Online (Sandbox Code Playgroud)