SQL查询示例

问题描述:

我的表看起来像这样的顺序..我想用这些条件计算TermID的;如果有可能也想要得到的结果集与这些头

- TermID必须关闭或开启状态
- TermID状态必须转向开(关开)
- 状态日期(打开状态)必须大于大约会关闭状态日期
SQL查询示例

与我的问候,

 

ID  TermID Status Date 
103990107 103641 Close 28/05/2010 
104000600 103641 Open 31/05/2010 
103980976 106458 Close 26/05/2010 
103990045 106458 Open 27/05/2010 
103939537 106475 Open 18/05/2010 
103908130 117220 Open 13/05/2010 
103929653 117220 Open 13/05/2010 
103999017 117360 Open 31/05/2010 
103834814 117402 Open 05/05/2010 
103993973 117420 Open 28/05/2010 
103849795 119377 Close 05/05/2010 
103955266 119377 Close 21/05/2010 
103995229 119377 Close 29/05/2010 
103979873 119704 Open 25/05/2010 
103832225 119767 Open 04/05/2010 
103925429 123229 Close 15/05/2010 
103986986 123932 Open 27/05/2010 

+1

工作什么数据库... – 2010-06-07 15:38:36

+1

你怎么知道什么日期是'117220'最新的,和'119377'他们都标有相同的日期和状态? – 2010-06-07 15:41:41

+1

你可能想尝试重述你的问题。您要求统计TermID,但您还想更改TermID状态和日期?如上所述,我不确定你想要做什么。我会把问题分解成单独的部分,而不是试图一次性说明你的整个问题。 – 2010-06-07 15:47:58

我觉得你问两个问题在这里:


1.如何计算所有TermID?

答案:您可以使用SQL中的count(...)聚合函数。

例子:

SELECT count(TermID) from <table> 

这将算表中的所有TermIDs。


2.如何更新我的记录有一个新的状态/状态日期?

答:使用UPDATE语句:

UPDATE <table> 
SET Status = 'Open', <column name> = <value>, ... 
WHERE Staus = 'Closed' 

注意:你问题似乎含糊不清,因此上述可能无法正常工作。请根据您的具体使用情况进行调整。

+0

即结果一个termID将是'106458',因为它在2010年5月26日首次关闭,并于2010年5月27日开放。打开状态发生在关闭状态之后。 我想获得已关闭的termIDs,现在它已经打开 – qods 2010-06-07 23:47:27

试试这个。这将在Oracle

SELECT TermID, COUNT(*) CNT FROM 
(
SELECT ID,TermID,Status, Date, 
LEAD(Status,1,NULL) OVER (PARTITION BY TermID ORDER BY Date DESC) NEXT_STATUS, 
FROM MYTABLE 
) 
WHERE Status = 'Close' AND NEXT_STATUS = 'Open'; 
+0

如何在tsql语法中编写此查询 – qods 2010-06-07 23:49:02

+0

如果它支持SQL:2003中的窗口函数,它应该在T-SQL中工作。你应该能够通过你的文档来验证。 – 2010-06-16 22:05:54