我们的数据库包含一个审计表,它在每次更改项目费用值时都会得到一个新的行。不幸的是,当实际上与以前的值没有更改时,它也可以得到行添加。我的任务是提取这些数据,这样我们就可以看到一个项目值是如何随时间变化的,但是我想从输出中排除任何连续重复的行。不连续的重复值是非常好的,因为它们反映了一个项目在价值上的上升和下降。
简化示例数据
ID 1, DateCreated 2016-03-02, Value 0
ID 2, DateCreated 2016-03-04, Value 0
ID 3, DateCreated 2016-03-05, Value 20
ID 4, DateCreated 201
我有张桌子看起来像这样:
BANK ACCOUNT_NAME EXCESS DEBT
Acme Bank Checking1 500 300
Acme Bank Personal 200 100
Bank One Business 100 50
我需要返回的sql查询。
BANK ACCOUNT_NAME EXCESS DEBT AVAILABLE
Acme Bank Checking1 500 300 300
Acme Bank
因此,我应该创建一个基于大型数据集(33918340行)中每个组的最后一行的视图,因此性能是关键问题。例如,从营业额表中获取每个银行账户的最后一次营业额。我使用的是类似于 SELECT t1.*
FROM turnover t1 LEFT JOIN turnover t2
ON (t1.bankaccnumber = t2.bankaccnumber AND t1.id < t2.id)
WHERE t2.id IS NULL; 性能不是很好,我后来不得不添加与客户相关的附加连接等。(这只是一个例子) 有没有更好的方法(使用Microsoft SQL Server 2014)?
在postgres中,可以使用DISTINCT ON查询组中的第一个值。如何在甲骨文中实现这一点?
来自postgres手册:
选择DISTINCT ON (表达式,.)只保留给定表达式计算为相等的每组行的第一行。对表达式的区分使用与ORDER (见上文)相同的规则进行解释。注意,每个集合的“第一行”是不可预测的,除非使用ORDER来确保首先显示所需的行。
例如,对于给定的表:
col1 | col2
------+------
A | AB
A | AD
A | BC
B | AN
B | BA
C | AC
C | CC
升序排
假设我有一个客户地址表:
+-----------------------+------------------------+
| CName | AddressLine |
+-----------------------+------------------------+
| John Smith | 123 Nowheresville |
| Jane Doe | 456 Evergreen Terrace |
| John Smith | 999 S
我有下面的表格
Id col1 col2 col3
1 c 2 m
2 c 3 6
2 b d u
3 e 6 9
4 1 v 8
4 2 b t
4 4 5 g
如你所见,id列中有重复的值,2和4。我只想选择具有唯一id值的行,而忽略后面具有重复id值的行。我只想保留具有重复值的第一行
1 c 2 m
2 c 3 6
3 e 6 9
4 1 v 8
有FK约束,所以我不能
以下面的例子为例,
SELECT * FROM user_objects WHERE status in ('INVALID','VALID') AND ROWNUM<=2;
通过使用上面的查询,无论状态是“有效”还是“无效”,我只能获得表中的前两个值。
让我们说,如果status列的第一个和第二个值是“无效的”,那么我只能得到具有“无效”状态的行。如果状态列的第一个和第二个值都是“有效”和“无效”,则可能会得到具有两个状态列的行。最后,如果状态的第一个和第二个值为“有效”,则只能得到具有“有效”状态列的行。
我需要的是,不管列中的顺序中的“状态”值是什么
假设我有一张桌子如下所示:
Name Part Address City ... Stuff
Bob X1 Y1 Z1 ... Stuff1
Bob X2 Y1 Z1 ... Stuff1
Bob X3 Y1 Z1 ... Stuff1
Susan V1 Y2 Z2 ... Stuff2
Susan V2 Y2 Z2 ... Stuff2
....
在这里,东西是很多列。注意地址,城市,一切都不会改变。
所以我只想返回第一行。我知道我需要这样做
SEL
假设我们有这样的桌子:
UserID ID FLAG
1 1 red
2 2 white
3 1 white
4 2 green
5 2 Brown
6 5 White
7 1 Blue
8 3 Green
9 4 Green
10 2 Red
11 4 Green
12 3 Black
我想得到两个ID的第一个标志和最后一个标志。我尝试使用min
我数据库的维护有问题。我们有一张表A和一张表B,有一对多的关系。现在,表B中的每一行都有1到10行,除了最近的5行之外,我希望看到每一行。如果B中有5行或更少的行来自A中的任何一行,我不想看到它,因为我不关心这些数据。
下面是我到目前为止的查询:
WITH cte (id, number)
AS
(
SELECT A.id, COUNT(*)
FROM A INNER JOIN B ON A.id=B.a
GROUP BY A.id
)
SELECT A.id, B.id, number
FROM cte c
INNER JOIN B ON B.a=c.id
WHER
这是我一年前问的一个问题的后续,Old thread当时我得到的答案工作得很好,但现在我发现我需要调整查询才能获得非活跃用户的最新结束日期。 这里又是一个快速的用户示例表,一些是活跃的,一些是非活跃的,还有一些有几个工作年限。 重新雇用某人时,将为该雇佣期间添加一个新行。用户名始终是相同的。 所以我想要找出哪些用户是残疾的,没有活跃的就业机会,如果有几个就业期间,我想要的是最晚结束日期的那个。每个用户名一行,其中包含所有列。 数据库为SQL Server 2016。 示例表: | username | name | active | Job title | enddate
我有一个表,其中有一些我想删除的不正确的数据。
逻辑如下。在代码、名称和源相等的情况下(如下表中的前三行),我希望保留最早日期的记录,所以在这种情况下是2017-01-02,然后删除另外两行。怎么做?
DateEntry Code Name Source
2017-01-02 ABCF Blah SS
2017-03-02 ABCF Blah SS
2017-04-02 ABCF Blah SS
2017-03-08 BVFT Andy SS
2017-
我有这么一张桌子
Id | Name | Date
1 John 2020-10-24 23:51:00.000
1 John 2020-10-25 08:00:00.000
2 Edward 2020-10-24 23:55:00.000
2 Edward 2020-10-25 08:02:00.000
2
我只是想知道是否有任何方法可以根据ROW_NUMBER()函数选择最后一行?基本上,我想为每个department_id选择最后一个(最大一个) emp_id。
SELECT
department_id, last_name, employee_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id
FROM
employees;
输出:
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_
我正在寻找SQL如何为列OBJID在表中选择第一个唯一值。我希望得到的结果是,OBJID (group )或(distinct)的第一次存在就无法工作。我也到处找过,但找不到解决办法。有没有人知道如何实现每个OBJID只在一行中使用值一次的结果。
OBJID OTHER YEAR TYPE OBJID OTHER YEAR TYPE
AA 4 2001 e36 AA 4 2001 e36
AA 5 2001 e36
AA
我在留言簿中有一个包含用户评论的表格。列有: id、user_id、标题、注释、时间戳。
我需要为每个用户选择最新的行。我曾尝试使用group by完成此操作,但没有成功,因为我无法在group by user_id所在的同一查询中选择其他任何内容:
SELECT user_id, MAX(ts) FROM comments GROUP BY user_id
例如,在这个查询中,我不能同时添加到选择列id、tilte和comment。如何做到这一点?
我使用的是row_number()表达式,但没有得到预期的结果。我有一个sql表,有些行是重复的。他们有相同的'BATCHID‘,我想为这些获得第二行号,对于其他人,我使用第一行号。我该怎么做呢?
SELECT * FROM (SELECT * , ROW_NUMBER() OVER (PARTITION BY BATCHID ORDER BY SCAQTY) Rn FROM SAYIMDCPC ) t
WHERE Rn=1
此代码只返回第一行,但我希望获得重复项的第二行。
我正在尝试确定执行以下操作的最佳方法……表A具有特定的start_date。表b有一大堆美元金额,根据收到的付款日期和时间不同。我只想显示表b中第一个日期出现的行,以及表a中的start_date。我也不想检索重复的ID号,这就是我现在遇到的问题。
到目前为止我有类似的东西..。
Select a.ID, a.Start_Date
From a
Left Join (Select ID, Min(Recd_Dt) as Mindate, Total_Recd
Group by ID, Total_Recd) b on a.ID = b.ID and a.Start_Date <= b.M
假设我有下一个SQL表,其中包含以下示例值:
ID Date User Publish
----------------------------------
1 05/20/16 Peter 1
2 05/20/16 Peter 2 <= Discarded
3 05/20/16 John 2
4 05/28/16 John 1
5 05/28/16 John 2 <= Discarded
6 07/01/16 Pe
大家下午好,
我有一个数据库表,其中包含有关员工疾病的数据。它看起来像这样。
Date ID State
2013-05-03 00:00:00 0002371 Working
2013-05-03 00:00:00 0002622 Working
2013-05-03 00:00:00 0005590 Working
2013-05-03 00:00:00 0005590 Sick
如果您注意到ID 00005590有两个条目,一个用于工作(他们计划),另一个表示他们打电话请病假。因