我有一个SQL表
name | engins| frank
---------------------------+-------+------
John Smith | 8422| 854
(1 rows)
并且需要进行查询,以便在engins超过2000时仅返回行john smith
答案 0 :(得分:1)
我会尝试这样的查询(PostgreSQL 8.4 +)
WITH TT AS (
SELECT start, stop, LAG(stop) OVER(ORDER BY stop ASC) AS lastStop
FROM yourtable
)
SELECT lastStop as start, start as stop
FROM TT
WHERE lastStop <> start;
LAG()选择上一行的值。
答案 1 :(得分:0)
创建一个包含一年列的表格,并使用所有有效年份填充该表格。现在加入开始和停止之间的年份。还有一点工作要做,但你应该可以从那里得到它。
答案 2 :(得分:0)
不知道这个语法是否在mysql中有效,但我在tsql中使用它。
使用您编写的代码获取不在开始列中的停止年份,反之亦然
并添加
之类的where子句其中start&gt; (选择前1名从表开始按顺序开始)
并且停止&lt; (通过停止desc从表顺序中选择前1名停止)
答案 3 :(得分:0)
使用FULL OUTER JOIN,如下所示:
SELECT
*
FROM
yourtable AS a
FULL OUTER JOIN yourtable AS b ON a.stop = b.start
WHERE
a.stop IS NULL
OR
b.start IS NULL
答案 4 :(得分:0)
SELECT *
FROM (
SELECT *, LAG(stop) OVER (ORDER BY start) AS start_anarchy, start AS stop_anarchy
FROM (
SELECT *
FROM reigns
UNION ALL
VALUES (NULL::INTEGER, NULL::INTEGER)
) q
) q
WHERE start_anarchy IS DISTINCT FROM stop_anarchy
这也将显示第一个统治者之前和最后一个统治者之后的年份。
再次从原始表中我试图得到一个输出表,我将在第一列中列出几个世纪,在第二列中列出该世纪所有负责人的平均时间。
SELECT TRUNC(start - 1, -2) AS century, AVG(stop - start) AS avg_reign
FROM q
GROUP BY
TRUNC(start - 1, -2)
几个世纪是根据统治的开始计算的,00
年是前几个世纪的最后几年(例如Constantine II
将是IX
世纪之王。